当前位置: 首页 > 面试题库 >

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

毕浩渺
2023-03-14
问题内容

如果我只想向集合中添加单个值,则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]将其视为要添加到集合中的元素,并且如错误消息所言,列表不能被散列,但是集合中的所有元素都应该是可散列的。引用文档,

返回一个新的setfrozenset对象,其元素来自可迭代。集合的元素必须是可哈希的。

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


 类似资料:
  • 主要内容:向 set 集合中添加元素,从set集合中删除元素,Python set集合做交集、并集、差集运算Python set 集合最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算,本节将一一讲解这些操作的具体实现。 向 set 集合中添加元素 set 集合中添加元素,可以使用 set 类型提供的 add() 方法实现,该方法的语法格式为: setname.add(element) 其中,setname 表示要添加元素的集合,element 表示要添加的元素内容。 需

  • 我创建了一个新的存储库: 然后我想将我的提交推送到github上创建的空远程存储库,因此我必须设置远程。 使用以下命令之间有什么区别 最后我执行推送: 当我在之后调用时会发生什么?是否创建来源?如果origin在之后已经存在,那么在我的场景中使用这些命令没有区别,对吧?

  • 我有下面一行代码: 但是,编译器会发出警告: scala.collection中任何类型模式的非变量类型参数。Set[Any]未选中,因为它通过擦除[warn]消除 很公平。 所以我把我的台词改成这样: 现在我得到一个错误: 找到[错误]:scala.collection.Set[_] [错误] 必需:scala.collection.Set[Any] 这两者有什么区别? 然后我将代码更改为以下内

  • 本文向大家介绍Python set常用操作函数集锦,包括了Python set常用操作函数集锦的使用技巧和注意事项,需要的朋友参考一下 定义 set是一个无序且不重复的元素集合。 集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,不可以为集

  • 我有一个Spark DataFrame,我正在尝试基于以前的列创建一个新列,但对我来说,困难的是我已经按行计算了列的值。例如: 列1 |列2 |列3 1 | 2 | 3 4|5|0 3 | 1 | 1 因此,我想要一个新列,每行具有表达式 max(col1, col2, col3)的列名。所以,所需的输出: Col1 |Col2 |Col3 |Col4 1|2|3|'col3' 4|5|0|'co

  • 我有以下代码: 在这部分代码中: 如果存在过滤器,则将过滤器应用于流; 想要对此流进行一些偏移和限制,但这不起作用,因为“应该只对一个流进行一次操作(调用中间或终端流操作)”。 映射到dto对象并收集为列表。 如何以其他方式进行流操作skip()和limit()。提前感谢。