Этот кусок кода дает мне ошибку, unhashable type: dict
может кто-нибудь объяснить мне, каково решение
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)
Ответы:
Вы пытаетесь использовать
dict
как ключ к другомуdict
или вset
. Это не работает, потому что ключи должны быть хэшируемыми. Как правило, только неизменяемые объекты (строки, целые числа, числа с плавающей запятой, заморозки, кортежи неизменяемых объектов) являются хэшируемыми (хотя возможны исключения). Так что это не работает:Чтобы использовать диктовку в качестве ключа, нужно сначала превратить его в нечто, что может быть хешировано. Если диктовка, которую вы хотите использовать в качестве ключа, состоит только из неизменяемых значений, вы можете создать ее хешируемое представление следующим образом:
Теперь вы можете использовать
key
в качестве ключаdict
илиset
:Конечно, вам нужно повторять упражнение всякий раз, когда вы хотите найти что-то, используя dict:
Если
dict
вы хотите использовать в качестве ключа значения, которые сами по себе являются диктатами и / или списками, вам необходимо рекурсивно «заморозить» предполагаемый ключ. Вот отправная точка:источник
str(my_dict)
могут возвращать две разные строки для одинаковых (или разных, но эквивалентных) словdict(the_frozenset)
.frozenset(dict_key.items())
это потенциально проблематично, потому что два текста с одинаковым содержимым, но с разным порядком вставки, могут не приводить к одному и тому же ключу. Добавление вызова к sorted () выглядит по порядку. Напримерfrozenset(sorted(dict_key.items()))
, frozenset кажется странным выбором, поскольку множества явно неупорядочены. Возможно, на практике это работает нормально, но мне кажется, что кортеж более логичен. Я пошел сtuple(sorted(dict_key.items()))
Возможным решением может быть использование метода JSON dumps (), чтобы вы могли преобразовать словарь в строку ---
Вывод -
источник
dumps
, нетdump
.