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

时间:2015-03-04 01:40:24

标签: python set

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

a = set()
a.update([1]) #works
a.add(1) #works
a.update([1,2])#works
a.add([1,2])#fails 

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

9 个答案:

答案 0 :(得分:76)

<强> set.add

set.add将一个单独的元素添加到集合中。所以,

>>> a = set()
>>> a.add(1)
>>> a
set([1])

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

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

这里,[1, 2]被视为要添加到集合中的元素,并且错误消息显示为a list cannot be hashed,但集合的所有元素都应该是hashables。引用documentation

  

返回一个新的setfrozenset对象,其元素取自iterable。集合的元素必须为hashable

<强> 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

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

>>> a.update([1])
>>> a
set([1])

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

在这里,我们显式地将所有迭代转换为集合,然后我们找到了联合。有多个中间集和联合。在这种情况下,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])

答案 1 :(得分:15)

对于单个元素,

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

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

  

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

     

s.update(t)s | = t返回从t

添加元素的集合

答案 2 :(得分:11)

add添加了一个元素,update“添加”另一个可迭代setlisttuple,例如:

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

答案 3 :(得分:4)

.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.

答案 4 :(得分:3)

add仅接受可播放类型。列表不可清除。

答案 5 :(得分:2)

您的代码中的

a.update(1)将无效。 add接受一个元素并将其放入集合中(如果它尚未存在),但update采用可迭代并使该集合的联合具有该可迭代。对于列表,它有点像appendextend

答案 6 :(得分:1)

我想没有人提到Hackerrank的优质资源。我想粘贴Hackerrank如何在python中提到更新和添加set之间的区别。

集合是唯一值的无序包。单个集包含任何不可变数据类型的值。

创建集

myset = {1, 2} # Directly assigning values to a set

myset = set() # Initializing a set

myset = set(['a', 'b']) # Creating a set from a list

print(myset)  ===> {'a', 'b'}

修改设置 - 添加()和更新()

myset.add('c')

myset  ===>{'a', 'c', 'b'}

myset.add('a') # As 'a' already exists in the set, nothing happens

myset.add((5, 4))

print(myset) ===> {'a', 'c', 'b', (5, 4)} 


myset.update([1, 2, 3, 4]) # update() only works for iterable objects

print(myset) ===> {'a', 1, 'c', 'b', 4, 2, (5, 4), 3}

myset.update({1, 7, 8})

print(myset) ===>{'a', 1, 'c', 'b', 4, 7, 8, 2, (5, 4), 3}

myset.update({1, 6}, [5, 13])

print(myset) ===> {'a', 1, 'c', 'b', 4, 5, 6, 7, 8, 2, (5, 4), 13, 3}

希望它有所帮助。有关Hackerrank的更多详细信息,请here is the link.

答案 7 :(得分:0)

add方法直接将元素添加到集合中,而update方法将第一个参数转换为集合,然后添加 该列表是可哈希的,因此我们无法将哈希列表添加到不可哈希的集合中。

答案 8 :(得分:0)

我们使用add()方法将单个值添加到集合中。

我们使用update()方法将序列值添加到集合中。

这里的序列是任何可迭代的变量,包括listtuplestringdict等。