Sin*_*ion 202

按套装,你的意思是list

>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

  • 该表示允许您将其粘贴回交互式会话中,因为`set`构造函数将iterable作为其参数. (7认同)
  • 是的,我没想到这是模棱两可的,但似乎是:)更新就是这样.谢谢! (4认同)
  • 请注意,该表示在 Python 3 中只是例如“{1, 2, 3}”,而在 Python 2 中是“set([1, 2, 3])”。 (4认同)
  • 回过头看我的解释器会话,我实际上尝试了这个,但认为它已经将整个列表添加为集合的元素,因为集合的表示中的方括号.我之前从未注意到他们的表现就像那样. (2认同)

Joh*_*hin 35

为了让任何可能相信例如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
Run Code Online (Sandbox Code Playgroud)

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

使用|= set()大约1.5倍的成本update只是循环中添加每个单独项目的一半.


gbc*_*gbc 12

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

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

  • 使用`.update`的好处是参数可以是任何迭代 - 不一定是一个集合 - 不像你的例子中`| =`运算符的RHS. (5认同)

Dan*_*ski 6

只是一个快速更新,使用 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)
Run Code Online (Sandbox Code Playgroud)

结果是:

one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
Run Code Online (Sandbox Code Playgroud)