Python:添加要设置的列表?

2020-12-04 16:36:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2.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无法判断我是否已将同一列表添加了两次。有解决办法吗?

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

3条回答
网友
1楼 ·

要将列表元素添加到集合中,请使用update

来自https://docs.python.org/2/library/sets.html

s.update(t): return set s with elements added from t

例如

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}

如果要将整个列表作为单个元素添加到集合中,则不能,因为列表不可散列。您可以添加一个元组,例如s.add(tuple(l))。有关详细信息,请参见TypeError: unhashable type: 'list' when using built-in set function

网友
2楼 ·

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

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

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

编辑:一些解释:文档将set定义为不同散列对象的无序集合。对象必须是可散列的,这样查找、添加和删除元素的速度就可以比每次执行这些操作时查看每个元素的速度快。使用的特定算法在Wikipedia article中进行了说明。Pythons散列算法在effbot.org函数和python reference函数中解释。

一些事实:

  • 集合元素以及字典键必须是散列的
  • 一些不可更改的数据类型:
    • list:改用tuple
    • set:改用frozenset
    • dict:没有正式的对应项,但是有一些 recipes
  • 默认情况下,对象实例是散列的,每个实例都有一个唯一的散列。可以重写此行为,如python引用中所述。
网友
3楼 ·

使用^{}|=

>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}

编辑:如果要添加列表本身而不是其成员,则很遗憾,必须使用元组。集合成员必须是hashable

相关问题