Ce morceau de code me donne une erreur, unhashable type: dict
quelqu'un peut-il m'expliquer quelle est la solution
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)
Réponses:
Vous essayez d'utiliser a
dict
comme clé d'un autredict
ou dans un fichierset
. Cela ne fonctionne pas car les clés doivent être hachables. En règle générale, seuls les objets immuables (chaînes, entiers, flottants, frozensets, tuples d'immuables) sont hachables (bien que des exceptions soient possibles). Donc cela ne fonctionne pas:Pour utiliser un dict comme clé, vous devez d'abord le transformer en quelque chose qui peut être haché. Si le dict que vous souhaitez utiliser comme clé se compose uniquement de valeurs immuables, vous pouvez en créer une représentation hachable comme ceci:
Vous pouvez maintenant utiliser
key
comme clé dans undict
ouset
:Bien sûr, vous devez répéter l'exercice chaque fois que vous souhaitez rechercher quelque chose à l'aide d'un dict:
Si la
dict
clé que vous souhaitez utiliser a des valeurs qui sont elles-mêmes des dictionnaires et / ou des listes, vous devez "figer" récursivement la clé prospective. Voici un point de départ:la source
str(my_dict)
pourraient donc renvoyer deux chaînes différentes pour les mêmes dictionnaires (ou différents, mais équivalents)dict(the_frozenset)
.frozenset(dict_key.items())
c'est potentiellement problématique en ce que deux dictionnaires avec le même contenu mais un ordre d'insertion différent peuvent ne pas donner la même clé. L'ajout d'un appel à sorted () semble dans l'ordre. Par exemplefrozenset(sorted(dict_key.items()))
, frozenset semble être un choix étrange étant donné que les ensembles sont explicitement non ordonnés. Cela fonctionne probablement bien dans la pratique, mais le tuple me semble être un choix plus logique. Je suis allé avectuple(sorted(dict_key.items()))
Une solution possible pourrait être d'utiliser la méthode JSON dumps (), afin de pouvoir convertir le dictionnaire en une chaîne ---
Production -
la source
dumps
, nondump
.