Python:添加列表来设置?

Ada*_*tan 209 python list set

在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
Run Code Online (Sandbox Code Playgroud)

我认为我无法将列表添加到集合中,因为Python无法判断如果我已经两次添加相同的列表.有解决方法吗?

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

aeh*_*lke 494

使用set.update()|=

>>> 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'}
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想添加列表本身而不是它的成员,那么你不得不使用元组.套装成员必须是可以清洗的.

  • 对于集合,“|”运算符实现了[集合并集操作](https://en.wikipedia.org/wiki/Union_(set_theory))。`|=` 运算符和 `set.update()` 方法都就地应用该操作,并且实际上是同义的。因此,“set_a |= set_b”可以被视为“set_a.update(set_b)”*和*“set_a = set_a |”的语法糖。set_b` (除了在后一种情况下,相同的 `set_a` 对象被重用而不是重新分配)。`&lt;/咳咳&gt;` (4认同)

Ott*_*ger 169

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

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

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
Run Code Online (Sandbox Code Playgroud)

编辑:一些解释:文档将a定义set不同的可清除对象的无序集合.对象必须是可清除的,这样每次执行这些操作时,查找,添加和删除元素的速度都比查看每个元素要快.维基百科文章解释了使用的具体算法.蟒散列算法是在解释effbot.org和蟒__hash__在功能蟒参考.

一些事实:

  • 设置元素以及字典键必须是可清除的
  • 一些不可用的数据类型:
    • list:tuple改用
    • set:frozenset改用
    • dict:没有官方对应物,但有一些 食谱
  • 默认情况下,对象实例是可清除的,每个实例都具有唯一的哈希值.您可以按照python参考中的说明覆盖此行为.

  • 如果您想要将集合添加到集合,请使用frozenset. (6认同)
  • [`collections.namedtuple`](http://docs.python.org/library/collections.html#collections.namedtuple)可能会被视为"dict"的"官方"对应物. (4认同)

JDi*_*teo 68

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

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

s.update(t):返回集合s,其元素从t添加

例如

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

如果您想要将整个列表作为单个元素添加到集合中,则不能因为列表不可清除.你可以改为添加一个元组,例如s.add(tuple(l)).另请参见TypeError:unhashable类型:使用内置set函数时的'list'以获取更多信息.


alv*_*vas 40

希望这有助于:

>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])
Run Code Online (Sandbox Code Playgroud)


小智 15

请注意功能set.update().文件说:

使用自身和其他人的联合更新集合.

  • 这不回答问题(因为OP希望将列表本身添加到集合中)但是当Google将我带到这里时,我需要的答案是:-) (5认同)
  • 好吧,这对我来说似乎是这个问题最相关的答案......例如,如果 b = set([1]), b.update([7,25]) 将为 b 提供以下值: set([ 1, 25, 7]) ---&gt; 这不是我们要找的吗? (2认同)

Sil*_*ost 8

列表对象不可删除.你可能想把它们变成元组.


Dun*_*nes 6

我发现我今天需要做一些类似的事情。该算法知道它何时创建需要添加到集合中的新列表,但不知道它何时完成对列表的操作。

无论如何,我想要的行为是 set 使用id而不是hash. 因此,我发现mydict[id(mylist)] = mylist而不是myset.add(mylist)提供我想要的行为。


hug*_*own 5

你想添加一个元组,而不是一个列表:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
Run Code Online (Sandbox Code Playgroud)

如果你有一个列表,你可以转换为元组,如上所示。元组是不可变的,因此可以将其添加到集合中。


use*_*331 5

集合不能具有可变(可变)元素/成员.一个可变的列表不能是一个集合的成员.

由于集合是可变的,因此您不能拥有一组集合!你可以拥有一套frozensets.

(同一种"可变性要求"适用于字典的键.)

其他答案已经给你代码,我希望这给了一些洞察力.我希望Alex Martelli能够回答更多细节.