小编典典

添加要设置的列表?

all

在 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 无法判断我是否两次添加了相同的列表。有解决方法吗?

编辑:我想添加列表本身,而不是它的元素。


阅读 80

收藏
2022-04-08

共1个答案

小编典典

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

但是,您可以将元组添加到集合中,因为您无法更改元组的内容:

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

编辑 :一些解释:文档将 a 定义set不同的可散列对象的无序集合。
对象必须是可散列的,以便查找、添加和删除元素比每次执行这些操作时查看每个单独的元素更快。使用的具体算法在Wikipedia
文章
中进行了解释。Python
散列算法在effbot.orgpython
参考
__hash__中的
python
函数中进行了解释。[

一些事实:

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