如何将可迭代对象的内容添加到集合中?
什么是将一个可迭代对象的所有项目添加到一个已有的 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])