Python:如何将一个迭代的内容添加到一个集合?
什么是将一个迭代器的所有项目添加到现有set
的“一个显而易见的方法” ?
一套,你的意思是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])
对于任何可能相信例如在循环中执行aset.add()
的人来说,执行aset.add()
都会带来性能上的竞争, aset.update()
是一个如何在上市之前快速testing信念的例子:
>\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倍,但在循环中添加每个单独项目的一半。
您可以使用set()函数将迭代器转换为集合,然后使用标准集更新运算符(| =)将新集合中的唯一值添加到现有集合中。
>>> a = { 1, 2, 3 } >>> b = ( 3, 4, 5 ) >>> a |= set(b) >>> a set([1, 2, 3, 4, 5])
套件也有添加的方法:
>>> s=set([1,2,3,4]) >>> for n in range(10): s.add(n) >>> s set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
使用列表理解。
使用列表短路创builditerable例如:)
>>> x = [1, 2, 3, 4] >>> >>> k = x.__iter__() >>> k <listiterator object at 0x100517490> >>> l = [y for y in k] >>> l [1, 2, 3, 4] >>> >>> z = Set([1,2]) >>> z.update(l) >>> z set([1, 2, 3, 4]) >>>
[编辑:错过了问题的一部分]
for item in items: extant_set.add(item)
为了logging,我认为“应该有一个 – 最好只有一个 – 明显的方法去做”。 是假的。 它假定许多有技术头脑的人做出,每个人都认为一样。 对一个人来说,显而易见的是另一个人不那么明显。
我会争辩说,我提出的解决scheme是清晰可读的,并按你的要求。 我不相信有任何的performance打击 – 虽然我承认我可能会错过一些东西。 但是尽pipe如此,对于另一个开发者来说,这可能并不明显,也不太可取。
我喜欢这种方式:
set = [item for item in items]