Ten fragment kodu daje mi błąd, unhashable type: dict
czy ktoś może mi wyjaśnić, jakie jest rozwiązanie
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)
Odpowiedzi:
Próbujesz użyć a
dict
jako klucza do innegodict
lub wset
. To nie działa, ponieważ klucze muszą być hashowane. Zasadniczo tylko niezmienne obiekty (ciągi znaków, liczby całkowite, zmiennoprzecinkowe, zestawy zamrożone, krotki elementów niezmiennych) są hashowane (choć możliwe są wyjątki). Więc to nie działa:Aby użyć dykta jako klucza, musisz przekształcić go w coś, co może być najpierw zaszyfrowane. Jeśli dykt, którego chcesz użyć jako klucza, składa się tylko z niezmiennych wartości, możesz utworzyć jego haszowalną reprezentację w następujący sposób:
Teraz możesz użyć
key
jako klucza w adict
lubset
:Oczywiście musisz powtórzyć ćwiczenie, gdy chcesz coś sprawdzić za pomocą dykta:
Jeśli
dict
klucz, którego chcesz użyć jako klucza, ma wartości, które same są dyktami i / lub listami, musisz rekurencyjnie „zamrozić” przyszły klucz. Oto punkt wyjścia:źródło
str(my_dict)
mogą zwrócić dwa różne ciągi dla tego samego (lub innego, ale równoważnego) dyktudict(the_frozenset)
.frozenset(dict_key.items())
jest to potencjalnie problematyczne, ponieważ dwa dykty z tą samą zawartością, ale inna kolejność wstawiania mogą nie dawać tego samego klucza. Dodawanie wywołania do sort () wydaje się być w porządku. Np.frozenset(sorted(dict_key.items()))
Frozenset wydaje się dziwnym wyborem, biorąc pod uwagę, że zestawy są wyraźnie nieuporządkowane. Prawdopodobnie działa dobrze w praktyce, ale krotka wydaje mi się bardziej logicznym wyborem. Poszedłem ztuple(sorted(dict_key.items()))
Możliwym rozwiązaniem może być użycie metody JSON dumps (), dzięki czemu można przekonwertować słownik na ciąg ---
Wynik -
źródło
dumps
, niedump
.