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
作为另一个dict
或set
一个键。 这是行不通的,因为密钥必须是可散列的。 作为一般规则,只有不可变对象(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
作为一个dict
或set
一个键:
>>> 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