TypeError:不可哈希类型:'dict'

这段代码给了我一个错误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)
707327 次浏览

你正在尝试使用dict作为另一个dictset的键。这行不通,因为键必须是可哈希的。作为一般规则,只有不可变对象(字符串、整数、浮点数、frozensets、不可变对象的元组)是可哈希的(尽管可能存在例外)。所以这行不通:

>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

要使用字典作为键,您需要先将其转换为可以哈希的内容。如果你希望用作键的dict只包含不可变值,你可以像这样创建一个可哈希表示:

>>> key = frozenset(dict_key.items())

现在你可以在dictset中使用key作为键:

>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}

当然,当你想用词典查东西的时候,你需要重复这个练习:

>>> some_dict[dict_key]                     # Doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())]  # Works
True

如果你想要用作键的dict的值本身是字典和/或列表,你需要递归地“冻结”预期键。这是一个起点:

def freeze(d):
if isinstance(d, dict):
return frozenset((key, freeze(value)) for key, value in d.items())
elif isinstance(d, list):
return tuple(freeze(value) for value in d)
return d

一个可能的解决方案是使用JSON dumps()方法,这样您就可以将字典转换为字符串——

import json


a={"a":10, "b":20}
b={"b":20, "a":10}
c = [json.dumps(a), json.dumps(b)]




set(c)
json.dumps(a) in c

输出-

set(['{"a": 10, "b": 20}'])
True
def frozendict(d: dict):
return frozenset(d.keys()), frozenset(d.values())

这发生在我身上,因为我在用Typescript思考,并试图像这样设置一个python字典:

thing = { 'key': 'value' }
other_thing = {'other_key': 'other_value'}
my_dictionary = { thing, other_thing }

然后我试着:

my_dictionary = { thing: thing, other_thing: other_thing }

...哪个还是不行

最终成功的是……

my_dictionary = { 'thing': thing, 'other_thing': other_thing }

有趣的是,我们习惯了不同语言的语法小技巧……