Este código me está dando un error, unhashable type: dict
¿alguien puede explicarme cuál es la solución?
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)
Respuestas:
Estás intentando usar a
dict
como clave para otrodict
o en aset
. Eso no funciona porque las claves tienen que ser hashaable. Como regla general, solo los objetos inmutables (cadenas, enteros, flotadores, congeladores, tuplas de inmutables) son hashables (aunque son posibles excepciones). Entonces esto no funciona:Para usar un dict como clave, debe convertirlo en algo que se pueda descifrar primero. Si el dict que desea utilizar como clave consta solo de valores inmutables, puede crear una representación hashaable de esta manera:
Ahora puede usar
key
como clave en undict
oset
:Por supuesto, debe repetir el ejercicio cada vez que desee buscar algo con un dict:
Si el
dict
que desea utilizar como clave tiene valores que son dictados y / o listas, debe "congelar" recursivamente la clave prospectiva. Aquí hay un punto de partida:fuente
str(my_dict)
podrían devolver dos cadenas diferentes para los mismos dictados (o diferentes, pero equivalentes)dict(the_frozenset)
.frozenset(dict_key.items())
es potencialmente problemático ya que dos dictados con el mismo contenido pero diferente orden de inserción pueden no dar como resultado la misma clave. Agregar una llamada a sorted () parece estar en orden. Por ejemplofrozenset(sorted(dict_key.items()))
, además, el conjunto congelado parece una elección extraña dado que los conjuntos están explícitamente desordenados. Probablemente funciona bien en la práctica, pero la tupla me parece una opción más lógica. Fui contuple(sorted(dict_key.items()))
Una posible solución podría ser utilizar el método JSON dumps (), para que pueda convertir el diccionario en una cadena ---
Salida -
fuente
dumps
, nodump
.