TypeError:不可能的types:'dict'

这段代码是给我一个错误unhashable type: dict任何人都可以解释我是什么解决scheme

 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作为另一个dictset一个键。 这是行不通的,因为密钥必须是可散列的。 作为一般规则,只有不可变对象(string,整数,浮点数,frozensets,不可变元组)是可散列的(尽pipe例外是可能的)。 所以这不起作用:

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

要使用一个字典作为一个关键,你需要把它变成可能首先被哈希的东西。 如果你想用作键的字典只包含不可变的值,你可以像这样创build一个可散列的表示forms:

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

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

 >>> 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 

如果您希望用作键的字典具有本身为string和/或列表的值,则需recursion“冻结”预期的键。 这是一个起点:

 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