将列表添加到set

如何将值列表添加到现有集?

498631 次浏览

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

然而,你可以向集合中添加元组,因为你不能改变元组的内容:

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

编辑:一些解释:文档将set定义为不同哈希对象的无序集合。对象必须是可哈希的,这样在每次执行这些操作时,查找、添加和删除元素可以比查看每个单独的元素更快。使用的具体算法在维基百科的文章中解释。python的哈希算法在effbot.org中解释,python的__hash__函数在python的参考中解释。

一些事实:

  • 组元素字典键必须是可哈希的
  • 一些不可哈希的数据类型:
    • list:使用tuple代替
    • set:使用frozenset代替
    • dict:没有官方对应的,但有一些 李食谱 < / > 李< / ul > < / >
    • 默认情况下,对象实例是可哈希的,每个实例都有唯一的哈希。如python参考中所述,您可以覆盖此行为。

添加列表的内容

使用set.update()|=操作符:

>>> a = set('abc')
>>> a
{'a', 'b', 'c'}


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


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

添加列表本身

不可能直接将列表本身添加到set中,因为set元素必须是hashable

相反,可以先将列表转换为元组:

>>> a = {('a', 'b', 'c')}


>>> xs = ['d', 'e']
>>> a.add(tuple(xs))
>>> a
{('a', 'b', 'c'), ('d', 'e')}

列表对象是不可哈希的。你可能想把它们转换成元组。

您将希望使用可哈希的元组(不能像列表那样对可变对象进行哈希)。

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

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

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

如果您有一个列表,您可以转换为元组,如上所示。元组是不可变的,所以它可以被添加到集合中。

集合不能有可变的元素/成员。列表是可变的,不能是集合的成员。

因为集合是可变的,所以你不能拥有集合的集合! 你可以有一组frozensets。

(同样的“可变性要求”也适用于字典的键。)

其他的答案已经给了你代码,我希望这能给你一点洞察力。 我希望Alex Martelli能给出更多细节

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

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

请注意函数set.update()。文件说:

用集合本身和其他集合的并集更新集合。

希望这能有所帮助:

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

我通常是这样做的:

def add_list_to_set(my_list, my_set):
[my_set.add(each) for each in my_list]
return my_set

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

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

s.update(t):返回包含从t中添加的元素的集合s

如。

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

如果相反,你想要将整个列表作为单个元素添加到集合,你不能,因为列表是不可哈希的。你可以添加一个元组,例如s.add(tuple(l))。更多信息请参见type: 'list'使用内置的set函数时

尝试使用*解包,如下所示:

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

非编辑器版本:

a=set('abcde')
l=['f', 'g']
print({*l, *a})

输出:

{'a', 'd', 'e', 'f', 'b', 'g', 'c'}

联合是最简单的方法:

list0 = ['a', 'b', 'c']


set0 = set()
set0.add('d')
set0.add('e')
set0.add('f')


set0 = set0.union(list0)


print(set0)

输出:

{'b', 'd', 'f', 'c', 'a', 'e'}