在Python中向集合添加值

562

如何向现有的set添加值?

9个回答

552
your_set.update(your_sequence_of_values)
例如,your_set.update([1, 2, 3, 4])。或者,如果你必须以某种其他原因在循环中生成这些值。
for value in ...:
    your_set.add(value)

当然,如果情况允许,使用单个.update调用批量进行操作更快且更方便。


145
.add 添加单个项,.update 添加多个项。这正确吗? - ThorSummoner
35
是的,.add 方法需要一个可散列类型作为参数,而 .update 方法需要一个可迭代对象作为参数。 - Bonnie
8
如果您使用更新功能添加字符串,它将会为您的字符串中的每个字符添加一个项目,因为它是可迭代的! - hgolov
3
需要注意的是,字符串作为“整体”对象时,应该使用.add而不是.update进行添加。最近我因为这个小细节遇到了一个相当难以察觉的错误。 - Alexandre
2
addupdate 会改变集合对象,你可以调用 {*a, *b} 返回一个新的集合对象。 - Beatriz Fonseca

444

定义一个集合

a = set()

使用 add 方法添加单个值

a.add(1)
a.add(2)

使用update方法,可以向不可变集合中添加元素,这些元素来自于元组、集合、列表或不可变集合。

a.update([3, 4])
>>> print(a)
{1, 2, 3, 4}

注意:由于集合元素必须是可哈希的,而列表被认为是可变的,因此您无法将列表 add 到集合中。您也不能将其他集合 add 到集合中。但是,您可以使用 .update 方法添加来自列表和集合的元素,如演示的那样。


1
你真的用同样的答案编辑了我的回答吗?感谢你的贡献? - RandallShanePhD

152

您还可以使用 | 运算符将两个集合连接起来(在集合理论中称为并集):

>>> my_set = {1}
>>> my_set = my_set | {2}
>>> my_set
{1, 2}

或者使用|=的简化形式:

>>> my_set = {1}
>>> my_set |= {2}
>>> my_set
{1, 2}

注意: 在Python 2.7之前的版本中,使用set([...])代替{...}


2
如果你有一个集合列表 my_sets,那么你可以执行 big_set = my_sets[0].union(*my_sets[1:]) 来将它们全部合并。 - zelusp

47

使用update,可以这样:

keep.update(newvalues)

18
这个问题是在搜索“Python如何向集合添加元素”时在Google上首先出现的,因此值得明确指出,如果您想要将整个字符串添加到集合中,应该使用.add()而不是.update()
假设您有一个字符串foo_str,其内容为'this is a sentence',并且您有一个等于set()的集合bar_set
如果您执行bar_set.update(foo_str),则集合的内容将为{'t','a',' ','e','s','n','h','c','i'}
如果您执行bar_set.add(foo_str),则集合的内容将为{'this is a sentence'}

2
升级(upvoted),为了澄清整个情况。 - Abdel-Raouf

2

我喜欢这样做:将原始集合和要添加的值都转换成列表,然后相加,最后再将它们转换回集合,就像这样:

最初的回答:

original_set = {1, 2, 3}
values_to_add = [4, 5, 6]
new_set = set(list(original_set) + values_to_add)

setMenu = {"Eggs", "Bacon"}
print(setMenu)
> {'Bacon', 'Eggs'}
setMenu = set(list(setMenu) + list({"Spam"}))
print(setMenu)
> {'Bacon', 'Spam', 'Eggs'}
setAdditions = {"Lobster", "Sausage"}
setMenu = set(list(setMenu) + list(setAdditions))
print(setMenu)
> {'Lobster', 'Spam', 'Eggs', 'Sausage', 'Bacon'}

这样我也可以轻松地使用相同的逻辑添加多个集合,如果我尝试使用.update()方法进行操作,则会出现TypeError: unhashable type: 'set'

最初的回答:


将集合转换为列表,再将其转换回去,会产生很多不必要的开销,似乎违背了使用集合的初衷。请考虑@nyuszika7h提出的解决方案以及下面评论区中的方法(我在这里贴出): big_set = my_sets[0].union(*my_sets[1:]) - Razzle Shazl

2

我想在这里添加一个快速说明。我正在寻找三种方法中最快的方法。

  1. 使用set.add()函数
  2. 使用set.update()函数
  3. 使用"|"操作符函数。

我发现,无论是添加单个值还是多个值到一个集合中,都必须使用set.add()函数。这是其他方法中最有效的方法。

所以我进行了测试,以下是结果:

  1. set.add() 耗时:0.5208224999951199
  2. set.update() 耗时:0.6461397000239231
  3. "|" 操作符 耗时:0.7649438999942504

备注:如果您想了解更多分析,请查看此处:Python集合中追加值的最快方法


0

对我来说,在Python 3中,它可以简单地这样工作:

keep = keep.union((0,1,2,3,4,5,6,7,8,9,10))

我不知道它是否正确...


0
keep.update((0,1,2,3,4,5,6,7,8,9,10))

或者

keep.update(np.arange(11))

2
你的回答并没有改进@sberry的现有答案,而@sberry的答案是在你的回答之前9年发布的。 - Razzle Shazl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接