将列表添加到集合
- 2025-04-15 09:20:00
- admin 原创
- 26
问题描述:
如何向现有集合中添加值列表?
解决方案 1:
添加列表的内容
使用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'}
添加列表本身
无法将列表本身直接添加到集合中,因为集合元素必须是可哈希的。
相反,可以先将列表转换为元组:
>>> a = {('a', 'b', 'c')}
>>> xs = ['d', 'e']
>>> a.add(tuple(xs))
>>> a
{('a', 'b', 'c'), ('d', 'e')}
解决方案 2:
您不能将列表添加到集合中,因为列表是可变的,这意味着您可以在将列表添加到集合后更改其内容。
但是,您可以将元组添加到集合中,因为您无法更改元组的内容:
>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
编辑:一些说明:文档将 a 定义set
为由不同的可哈希对象组成的无序集合。这些对象必须是可哈希的,这样查找、添加和删除元素的速度才能比每次执行这些操作时都逐个查看元素更快。所使用的具体算法在Wikipedia 文章中有解释。Python 的哈希算法在effbot.org上有解释,Python 的__hash__
函数在Python 参考中有解释。
一些事实:
集合元素和字典键必须是可哈希的
一些不可散列的数据类型:
list
:tuple
改为使用set
:frozenset
改为使用dict
:没有官方对应,但有一些
食谱对象实例默认可哈希,每个实例都有唯一的哈希值。您可以按照 Python 参考中的说明覆盖此行为。
解决方案 3:
要将列表的元素添加到集合中,请使用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))
另请参阅使用内置 set 函数时出现的 TypeError: unhashable type: 'list'。
解决方案 4:
希望这有帮助:
>>> 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'])
解决方案 5:
请注意该函数set.update()
。文档中写道:
使用其自身和其他集合的并集来更新集合。
解决方案 6:
列表对象是不可散列的。不过,您可能想将它们转换为元组。
解决方案 7:
集合不能包含可变(可更改)的元素/成员。列表由于可变,所以不能成为集合的成员。
由于集合是可变的,所以你不能拥有一组集合!不过,你可以拥有一组冻结集。
(相同类型的“可变性要求”适用于字典的键。)
其他答案已经给出了代码,希望这能给你一些启发。希望 Alex Martelli 能提供更详细的信息。
解决方案 8:
我今天发现我需要做类似的事情。算法知道什么时候创建一个需要添加到集合中的新列表,但不知道什么时候完成对列表的操作。
无论如何,我想要的行为是 set to useid
而不是hash
。因此,我找到了mydict[id(mylist)] = mylist
而不是myset.add(mylist)
来提供我想要的行为。
解决方案 9:
您想要添加一个元组,而不是一个列表:
>>> 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')])
如果你有一个列表,你可以将其转换为元组,如上所示。元组是不可变的,因此可以将其添加到集合中。
解决方案 10:
您将需要使用可散列的元组(您不能对列表等可变对象进行散列)。
>>> 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')])
解决方案 11:
Union 是最简单的方法:
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'}
解决方案 12:
我通常的做法如下:
def add_list_to_set(my_list, my_set):
[my_set.add(each) for each in my_list]
return my_set
解决方案 13:
尝试使用*
解包,如下所示:
>>> 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'}
扫码咨询,免费领取项目管理大礼包!