如何将可迭代对象的内容添加到集合中?

194 投票
5 回答
131811 浏览
提问于 2025-04-16 06:14

什么是将一个可迭代对象的所有项目添加到一个已有的 set 中的“唯一明显的方法”?

5 个回答

17

你可以使用set()这个函数,把一个可迭代的对象(比如列表)转换成一个集合。然后,你可以用标准的集合更新操作符(|=)把新集合中的唯一值添加到已有的集合里。

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
54

为了帮助那些可能认为在循环中使用 aset.add() 的性能和使用 aset.update() 相当的人,这里有一个例子,教你如何快速测试自己的想法,确保在公开之前有个了解:

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop

看起来,循环方法每个项目的成本是 update 方法的三倍多。

使用 |= set() 的成本大约是 update 的1.5倍,但只相当于在循环中逐个添加每个项目成本的一半。

270

你可以像这样把一个 list(列表)里的元素添加到一个 set(集合)中:

>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])

撰写回答