Python 类型错误:不可损坏的类型:';dict';

Python 类型错误:不可损坏的类型:';dict';,python,Python,这段代码给了我一个错误不可损坏类型: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(s

这段代码给了我一个错误
不可损坏类型: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
的键,或在
集合中使用该键。这不起作用,因为密钥必须是可散列的。一般来说,只有不可变对象(字符串、整数、浮点数、Frozenset、不可变元组)是可散列的(尽管可能有例外)。所以这不起作用:

>>> 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
set
中的键:

>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
当然,当你想使用dict查找某个内容时,你需要重复此练习:

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

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

输出-

set(['{"a": 10, "b": 20}'])
True

RTD显示错误报告会很有用,这样我们可以看到哪一行有问题…谢谢,它可以工作,但是如果值是dict或list(不可修改),仍然会出错,现在我使用hash(str(my_dict)),对我来说很好。只需注意@StevenDu dictionaries不能保证顺序,所以
str(my_dict)
可以为相同(或不同,但等效)的dict返回两个不同的字符串要将生成的frozenset转换回dict,只需调用
dict(the_frozenset)
。在我看来,
frozenset(dict_key.items())
可能存在问题,因为内容相同但插入顺序不同的两个DICT可能不会产生相同的键。添加对sorted()的调用似乎符合顺序。例如,
frozenset(排序(dict_key.items())
此外,鉴于集合显式无序,frozenset似乎是一个奇怪的选择。它在实践中可能运行良好,但对我来说,tuple似乎是一个更符合逻辑的选择。我选择了tuple(排序的(dict_key.items())
,尽管答案提到将dict添加到集合中,但这种情况不会得到处理。有人接受吗?JSON是由。因此,更改名称/值对的顺序将导致一个“不同”的JSON字符串,该字符串将注册为集合的新成员。实际上,这可能没什么大不了的,因为
json.dumps()
可能是可预测的,但这是需要注意的。
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
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