添加列表进行设置?


问题内容

在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')])

编辑 :某些解释:文档将a定义set不同的可哈希对象的无序集合。
这些对象必须是可哈希化的,因此,与每次执行这些操作时都要查看每个单独的元素相比,查找,添加和删除元素可以更快地完成。Wikipedia文章中说明了使用的特定算法。在effbot.org上说明了Python的哈希算法,并且__hash__python参考中提供了pythons函数。

一些事实:

  • 集合元素 以及 字典键 必须是可哈希的
  • 一些不可散列的数据类型:
    • listtuple改用
    • setfrozenset改用
    • dict:没有官方对应文件,但有一些 食谱
  • 默认情况下,对象实例是可哈希的,每个实例都有唯一的哈希。您可以按照python参考中的说明覆盖此行为。