Python:添加列表设置?

问题:

测试在Python 2.6解释器:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    a.add(l)
TypeError: list objects are unhashable

我认为我无法将列表添加到该集合中,因为Python无法告诉我如果两次添加相同的列表。有解决办法吗?
 编辑:我想添加列表本身,而不是其元素。

回答:

您不能将列表添加到集合中,因为列表是可变的,这意味着您可以在将列表添加到集合中后更改列表的内容。
然而,您可以向集合添加元组,因为您不能更改元组的内容:

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

 编辑:一些解释:文档将set定义为an unordered collection of distinct hashable objects.对象必须是可以进行散列的,因此,每次执行这些操作时,查找,添加和删除元素都可以比查看每个元素更快。所使用的具体算法在Wikipedia article中进行了说明。 python reference中的effbot.org和pythons __hash__函数解释了Pythons散列算法
一些事实:

  •  设置元素以及字典键必须是可散列的
  • 一些不可分类的数据类型:

     

    • list: use tuple instead
    • set: use frozenset instead
    • dict: has no official counterpart, but there are some
      recipes
  • 默认情况下,对象实例是可散列的,每个实例都具有唯一的散列。您可以按照python引用中的说明重写此行为。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python: Add list to set?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 8 = 18