2024-03-28 10:44:34 发布
网友
如果我只想向集合中添加一个值,那么python中的add和update操作之间的区别是什么。
a = set() a.update([1]) #works a.add(1) #works a.update([1,2])#works a.add([1,2])#fails
有人能解释一下为什么会这样吗。
^{}
set.add向集合中添加单个元素。所以
set.add
>>> a = set() >>> a.add(1) >>> a set([1])
有效,但它不能与iterable一起工作,除非它是散列的。这就是a.add([1, 2])失败的原因。
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但是集合的所有元素都应该是散列的。引用documentation
[1, 2]
Return a new set or frozenset object whose elements are taken from iterable. The elements of a set must be hashable.
set
frozenset
在^{}的情况下,您可以将多个iterable传递给它,它将迭代所有iterable并将单个元素包含在集合中。记住:它只能接受iterables。这就是为什么当您试图用1更新它时会出现错误的原因
1
>>> a.update(1) Traceback (most recent call last): File "<input>", line 1, in <module> TypeError: 'int' object is not iterable
但是,由于列表[1]是迭代的,并且列表的元素被添加到集合中,所以下面的方法可以工作。
[1]
>>> a.update([1]) >>> a set([1])
set.update基本上等同于就地集合联合操作。考虑以下情况
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])
在这里,我们显式地将所有的iterable转换为set,然后找到并。有多个中间集和联合。在这种情况下,set.update是一个很好的帮助函数。既然它接受任何iterable,您可以简单地
>>> a.update([1, 2], range(3, 5), (i for i in range(1, 5) if i % 2 == 1)) >>> a set([1, 2, 3, 4])
add对于单个元素来说速度更快,因为它正是为此目的而添加的,添加单个元素:
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需要iterable或iterable,因此如果要添加单个哈希元素,请使用add;如果要添加iterable或iterable的哈希元素,请使用update。
update
s.add(x) add element x to set ss.update(t) s |= t return set s with elements added from t
s.add(x) add element x to set s
s.update(t) s |= t return set s with elements added from t
add添加元素,update“添加”另一个iterableset、list或tuple,例如:
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])
^{}
set.add
向集合中添加单个元素。所以有效,但它不能与iterable一起工作,除非它是散列的。这就是
a.add([1, 2])
失败的原因。这里,
[1, 2]
被视为添加到集合的元素,正如错误消息所说,a list cannot be hashed但是集合的所有元素都应该是散列的。引用documentation^{}
在^{} 的情况下,您可以将多个iterable传递给它,它将迭代所有iterable并将单个元素包含在集合中。记住:它只能接受iterables。这就是为什么当您试图用
1
更新它时会出现错误的原因但是,由于列表
[1]
是迭代的,并且列表的元素被添加到集合中,所以下面的方法可以工作。set.update
基本上等同于就地集合联合操作。考虑以下情况在这里,我们显式地将所有的iterable转换为set,然后找到并。有多个中间集和联合。在这种情况下,
set.update
是一个很好的帮助函数。既然它接受任何iterable,您可以简单地add
对于单个元素来说速度更快,因为它正是为此目的而添加的,添加单个元素:update
需要iterable或iterable,因此如果要添加单个哈希元素,请使用add
;如果要添加iterable或iterable的哈希元素,请使用update
。add
添加元素,update
“添加”另一个iterableset
、list
或tuple
,例如:相关问题 更多 >
编程相关推荐