185

将可迭代的所有项目添加到现有的“一个 [...] 明显的方法”set是什么?

4

6 回答 6

257

您可以像这样将 a 的元素添加list到 a 中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])
于 2010-10-28T17:25:34.097 回答
47

为了任何可能相信的人的利益,例如,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()成本的 1.5 倍。update

于 2010-10-28T18:55:52.373 回答
17

您可以使用 set() 函数将可迭代对象转换为集合,然后使用标准集合更新运算符 (|=) 将新集合中的唯一值添加到现有集合中。

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
于 2010-10-28T17:37:11.937 回答
8

只是一个快速更新,使用 python 3 的时间:

#!/usr/local/bin python3
from timeit import Timer

a = set(range(1, 100000))
b = list(range(50000, 150000))

def one_by_one(s, l):
    for i in l:
        s.add(i)    

def cast_to_list_and_back(s, l):
    s = set(list(s) + l)

def update_set(s,l):
    s.update(l)

结果是:

one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
于 2018-02-04T08:21:57.543 回答
0

使用列表理解。

例如,使用列表短路可迭代的创建:)

>>> 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])
>>> 

[编辑:错过了问题的设定部分]

于 2010-10-28T17:17:46.430 回答
-3
for item in items:
   extant_set.add(item)

作为记录,我认为“应该有一种——最好只有一种——明显的方式来做到这一点”的断言。是假的。它做出了许多具有技术头脑的人所做的假设,每个人的想法都是一样的。对一个人来说显而易见的事情对另一个人来说并不那么明显。

我会争辩说,我提出的解决方案清晰易读,并且可以满足您的要求。我不相信它会影响性能——尽管我承认我可能会遗漏一些东西。但尽管如此,对于其他开发人员来说,它可能并不明显和更可取。

于 2010-10-28T17:28:17.487 回答