将基于集合的对象作为属性进行比较| TypeError:不可用的类型

时间:2016-12-26 12:08:44

标签: python python-3.x

python中的一个让我感到非常恐怖的是这个错误:TypeError: unhashable type

理想情况下,我希望有一个数据结构,我只使用集合而不是列表,所以我可以像这样使用集合运算符:

a = {({1,2}, 'alpha'), ({2,3}, 'beta')}
b = {({1,2}, 'alpha')}

c = a - b # c = {({2,3}, 'beta')}

我甚至无法创建包含集合的集合,因为我得到TypeError: unhashable type: set

所以我尝试使用列表而不是集合。这样我至少可以为a和b分配值。但是再次使用set方法从一个集合中减去另一个集合导致相同的错误:

a = [({1,2}, 'alpha'), ({2,3}, 'beta')]
b = [({1,2}, 'alpha')]

c = list(set(a) - set(b)) # c = [({2,3}, 'beta')]

我用字典而不是列表尝试了它,同样的错误。

问题:如何比较包含某些地方包含集合的元素的两个数据集?

或者我在思考根本错误/"不是pythonic"并且错误根植于数据结构本身?

感谢您的帮助!

莫夫

2 个答案:

答案 0 :(得分:3)

你唯一能做的就是对内部数据使用frozenset(如果来自外部世界,则将变换集转换为frozensets),因为它是为此创建的。

标准库中没有可变数据结构可以进行哈希处理(可能大部分实现都不应该),原因很简单。如果您将考虑如何在集合/列表上实现哈希,那么您将快速得到它;)

答案 1 :(得分:2)

您只能将不可变(或至少hashable)数据放入set(或作为字典的键)。 [ {Y,Z,X} , {C,D,E,A,B} , {W,U,V} ] 本身并非一成不变;但是frozenset是。

类似的问题在这里:Why aren't Python sets hashable?

set

现在这就是你想要的。