python - 在python的集合操作中添加vs更新

标签 python set

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

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

有效,但它不能与可迭代对象一起使用,除非它是可散列的。这就是 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 ,

Return a new set or frozenset object whose elements are taken from iterable. The elements of a set must be 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])

关于python - 在python的集合操作中添加vs更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845284/

相关文章:

python - xlrd 单元格值返回错误

c++ - 在插入集合 C++ 之前比较字符串

python - 如何在尺寸有限的结构中保存有序的独特元素?

android - 使用 Facebook SDK 登录后仅设置一次图像

c++ - 集合的结构之间的比较

python - 对 Google Geocoding API 的普通 HTTP API 调用因 Python 请求模块而失败

python - 用于在 minion 中运行状态的 Salt Python API

python - 有没有办法改变乌龟中文本框的位置?它总是显示在左上角,但我希望它位于底部中央

python - 查看 celery 任务是否存在

ios - 您必须做什么才能让设置操作对自定义对象起作用?