为什么set,dicts,list在python中是不可用的

时间:2016-03-05 06:45:49

标签: python hash set

不可取的究竟是什么意思?

>>> a={1,2,3}
>>> b={4,5,6}
>>> set([a,b])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>>

任何人都可以告诉错误究竟是什么吗?我也可以在python中添加set到另一个集合吗?

3 个答案:

答案 0 :(得分:3)

没有名为unhashable的{​​{3}}属性的对象。 Python文档很好地描述了原因:

  

如果一个类定义了可变对象并实现了__eq__()方法,那么它不应该实现__hash__(),因为hashable集合的实现要求键的哈希值是不可变的(如果对象的哈希值发生变化) ,它将在错误的哈希桶中。)

答案 1 :(得分:3)

正如Kasramvd所解释的那样,python中mutable并实现__eq__函数的对象是不可用的。

由于集合,列表和dicts是可变的(即可以更改它们;例如,您可以添加,删除所有项目),它们不能进行哈希处理。

由于无法使用一组集合,也许一组元组可能会起作用,但您需要执行额外的簿记(例如确保唯一值)才能实现您所描述的内容。

a = (1,2,3)
b = (4,5,6)
c = set([a,b])

甚至更好,一组frozensets。与sets类似,但是不可变(你不能添加或删除它们中的元素)。

a = frozenset(a)
b = frozenset(b)
c = set([a,b])

答案 2 :(得分:0)

  

哈希函数是可用于映射数据的任何函数   任意大小的固定大小的数据。哈希返回的值   函数称为哈希值,哈希码,哈希值或简单   散列。

python中的字典只是一个哈希映射。

集合只能包含字符串或字符或数字,但不能包含dics或其他集合。 你可能想看看:https://docs.python.org/2/tutorial/datastructures.html#sets