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]