Este pedaço de código está me dando um erro. unhashable type: dict
Alguém pode me explicar qual é a solução
negids = movie_reviews.fileids('neg')
def word_feats(words):
return dict([(word, True) for word in words])
negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
stopset = set(stopwords.words('english'))
def stopword_filtered_word_feats(words):
return dict([(word, True) for word in words if word not in stopset])
result=stopword_filtered_word_feats(negfeats)
Respostas:
Você está tentando usar um
dict
como uma chave para outrodict
ou em umset
. Isso não funciona porque as chaves precisam ser laváveis. Como regra geral, apenas objetos imutáveis (seqüências de caracteres, números inteiros, flutuadores, conjuntos de propriedades, tuplas de imutáveis) são laváveis (embora sejam possíveis exceções). Portanto, isso não funciona:Para usar um ditado como chave, você precisa transformá-lo em algo que pode ser primeiro misturado. Se o ditado que você deseja usar como chave consistir apenas em valores imutáveis, você poderá criar uma representação hashável assim:
Agora você pode usar
key
como chave em umdict
ouset
:Claro que você precisa repetir o exercício sempre que quiser procurar algo usando um ditado:
Se
dict
você deseja usar como chave possui valores que são dictos e / ou listas, é necessário "congelar" recursivamente a chave em potencial. Aqui está um ponto de partida:fonte
str(my_dict)
pudesse voltar duas cordas diferentes para os mesmos (ou diferentes, mas equivalentes) dictsdict(the_frozenset)
.frozenset(dict_key.items())
é potencialmente problemático, pois dois ditados com o mesmo conteúdo, mas com ordem de inserção diferente, podem não resultar na mesma chave. Adicionar uma chamada a classificado () parece em ordem. Por exemplo:frozenset(sorted(dict_key.items()))
Além disso, o frozenset parece uma escolha estranha, uma vez que os conjuntos são explicitamente desordenados. Provavelmente funciona bem na prática, mas a tupla parece uma escolha mais lógica para mim. Eu fui comtuple(sorted(dict_key.items()))
Uma solução possível pode ser usar o método JSON dumps (), para que você possa converter o dicionário em uma sequência ---
Resultado -
fonte
dumps
, nãodump
.