在python中的set操作中添加vs更新

ace*_*ner 66 python set

如果我只想在集合中添加单个值,那么在python中添加和更新操作之间有什么区别.

a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails 
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样.

the*_*eye 85

set.add

set.add在集合中添加单个元素.所以,

>>> a = set()
>>> a.add(1)
>>> a
set([1])
Run Code Online (Sandbox Code Playgroud)

可以工作,但它不能与iterable一起使用,除非它是可以清除的.这就是a.add([1, 2])失败的原因.

>>> a.add([1, 2])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

这里,[1, 2]被视为添加到集合中的元素,并且如错误消息所示,列表不能被散列,但集合的所有元素都应该是hashables.引用文档,

返回一个新元素setfrozenset对象,其元素取自iterable.集合的元素必须是可以清除的.

set.update

在这种情况下set.update,您可以向其传递多个迭代,它将迭代所有迭代,并将包含集合中的各个元素.记住:它只能接受迭代.这就是为什么当您尝试使用更新时收到错误的原因1

>>> a.update(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)

但是,以下方法是有效的,因为列表[1]是迭代的,列表的元素被添加到集合中.

>>> a.update([1])
>>> a
set([1])
Run Code Online (Sandbox Code Playgroud)

set.update基本上相当于就地集合并操作.考虑以下情况

>>> set([1, 2]) | set([3, 4]) | set([1, 3])
set([1, 2, 3, 4])
>>> set([1, 2]) | set(range(3, 5)) | set(i for i in range(1, 5) if i % 2 == 1)
set([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

在这里,我们显式地将所有迭代转换为集合,然后我们找到了union.有多个中间集和联合.在这种情况下,set.update作为一个好帮手功能.既然它接受任何可迭代的,你就可以做到

>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1))
>>> a
set([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)


Pad*_*ham 16

add 单个元素更快,因为它正是为了这个目的,添加一个元素:

In [5]: timeit a.update([1])
10000000 loops, best of 3: 191 ns per loop

In [6]: timeit a.add(1) 
10000000 loops, best of 3: 69.9 ns per loop
Run Code Online (Sandbox Code Playgroud)

update 期望迭代或迭代,所以如果你有一个可以添加add的可清除元素,那么使用如果你有一个可迭代元素的可迭代或可迭代元素来添加使用update.

s.add(x)将元素x添加到集合s

s.update(t)s | = t返回集合s,其中添加了从t添加的元素

  • 虽然这可能是显而易见的,但应该注意的是,`update`可以更快地同时添加大量元素:`timeit a.update(范围(10000))#=> 1000循环,最佳3:每循环431μs `,同时`在范围内的时间为(10000):a.add(i)#=> 1000循环,最佳3:每循环1.18 ms (3认同)

Aka*_*all 11

add添加一个元素,update"添加"另一个可迭代set,list或者tuple,例如:

In [2]: my_set = {1,2,3}

In [3]: my_set.add(5)

In [4]: my_set
Out[4]: set([1, 2, 3, 5])

In [5]: my_set.update({6,7})

In [6]: my_set
Out[6]: set([1, 2, 3, 5, 6, 7])
Run Code Online (Sandbox Code Playgroud)


mon*_*kut 5

.add()用于单个element,而.update()用于其他集合。

从help():

add(...)
    Add an element to a set.

    This has no effect if the element is already present.


update(...)
    Update a set with the union of itself and others.
Run Code Online (Sandbox Code Playgroud)