草庐IT

集合(set)

思必得_22 2023-04-20 原文

4.6 集合(set)

集合是由不重复元素组成的无序容器。集合中的元素不能重复,即使向集合中再添加同样的元素,也只会保留一个。由于集合的这种特性,所以一般可以用集合进行去重。
集合中不能添加可变对象(不可哈希),因为无法判断两个可变对象是否相同,也就无法保证集合的内部不会有重复元素。
集合中的元素是无序的,我们通过print可以显示集合内的元素,但是显示的结果并非是集合中的元素的顺序。这意味着集合不能通过索引或切片获取内部的元素。

4.6.1 集合的创建

4.6.1.1 通过集合标识符号创建

列表在创建的时候用{}做标识。内部的元素用逗号进行分隔。
>>> st = {1} # 仅一个元素的集合
>>> st2 = {'a', 'b', 'c'} # 集合中存放的全是字符
>>> st3 = {1, 'a', '中'} # 集合中存放混合数据
>>> st4 = {'red', 'green', 'blue'} # 集合中存放的全是字符串

4.6.1.2 通过集合推导式创建

>>> {x for x in range(5)}

>>> {x * x for x in range(10)}

>>> {x*x for x in range(10) if x % 3 == 0}

4.6.1.3 通过set函数创建

set函数可以将一个可迭代对象转换成集合。如果可迭代对象中有重复的元素则会自动去除保留一个。
>>> print(set('Pythonn')) # 只会保留一个n

{'P', 'y', 't', 'h', 'o', 'n'}
>>> set() # 创建空的集合
{}

注意:不能通过st = {}创建空集合,因为这样会创建空的字典。

4.6.1.4 通过frozenset函数创建

set函数可以创建一个普通的集合(可以修改),但是通过frozenset函数创建的集合是一个不可修改的集合,创建后就不能再修改里面的元素,包括增加、删除、清空等。
>>> st = frozenset('python')
>>> st

frozenset({'o', 't', 'p', 'h', 'y', 'n'})

>>> st.add('l')

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
AttributeError: 'frozenset' object has no attribute 'add'

4.6.2 集合的访问

4.6.2.1 遍历集合

参见可迭代对象章节中的可迭代对象的遍历

4.6.2.2 成员资格检查

参见可迭代对象中的成员资格检查

4.6.3 集合的运算

4.6.3.1 并集(返回两个集合所有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 | st2

4.6.3.2 交集(返回两个集合都有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 & st2

4.6.3.3 差集(返回前者集合有而后者没有的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 - st2

4.6.3.4 对称差(返回不同时在2个集合中的元素的集合)

>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1 - st2

4.6.4 集合的关系

A < B # 返回A是否是B的子集(同:A.issubset(B))
A > B # 返回A是否是B的超集(同:A.issuperset(B))

4.6.5 集合的方法

4.6.5.1 添加元素

4.6.5.1.1 add(x)

描述
为集合添加元素
示例
>>> st = {1, 2}
>>> st.add(3)
>>> st

4.6.5.1.2 update(x)

描述
添加新的元素或集合到当前集合中。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.update(st2)
>>> st1

4.6.5.2 删除元素

4.6.5.2.1 remove(x)

描述
指定删除集合中的元素。要删除的元素必须在目标集合中存在,否则引发KeyError异常。
示例
>>> st1 = {1, 2, 3}
>>> st1.remove(2)
>>> st1

4.6.5.2.2 discard()

描述
删除集合中指定的元素。如果要删除的元素不在目标集合中则不起任何作用。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st1.discard(2)
>>> st1

4.6.5.2.3 pop()

描述
随机删除集合中的一个元素
示例
>>> st1 = {1, 2, 3}
>>> st1.pop()

1

>>> st1

4.6.5.2.4 clear()

描述
移除集合中的所有元素
示例
>>> st = {1, 2}
>>> st.clear()
>>> st

{}

4.6.5.3 查询统计类

4.6.5.3.1 union(x)

描述
返回两个集合的并集。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.union(st2)

4.6.5.3.2 intersection()、intersection_update()

描述
返回多个集合的交集。intersection不修改原对象内容,直接返回结果,而intersection_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.intersection(st2)

4.6.5.3.3 difference()、difference_update()

描述
返回多个集合的差集。difference不修改原对象内容,直接返回结果,而difference_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3}
>>> st2 = {2, 4, 6}
>>> st1.difference(st2)

4.6.5.3.4 symmetric_difference()、symmetric_difference_update()

描述
返回两个集合中不重复的元素的集合(对称差)。symmetric_difference不修改原对象内容,直接返回结果,而symmetric_difference_update会修改原对象内容。
示例
>>> st1 = {1, 2, 3, 4, 5}
>>> st2 = {2, 4, 6, 8, 10}
>>> st1.symmetric_difference(st2)

4.6.5.3.5 issubset()、issuperset()

描述
判断前者集合是否是后者集合的子集(超集),如果为真,则返回True,否则返回False。
示例
>>> st1 = {1, 2}
>>> st2 = {1, 2, 4}
>>> st1.issubset(st2)

True

4.6.5.3.6 isdisjoint()

描述
判断两个集合是否不相交(即不含有相同元素),如果不相交则返回True,否则返回False。
示例
>>> st1 = {1, 2}
>>> st2 = {2, 4}
>>> st3 = {3, 6}
>>> st1.isdisjoint(st2)
>>> st1.isdisjoint(st3)

False
True

4.6.5.4 其它类

4.6.5.4.1 copy()

描述
拷贝一个集合
示例
>>> st = {1, 2, 3}
>>> st2 = st.copy()
>>> st2

有关集合(set)的更多相关文章

  1. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  2. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  3. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  4. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  5. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  6. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  7. ruby - 厨师和 ruby : how to convert a array into a set - 2

    我有一个如下所示的数组:nodes=['server1','server1','server2']在厨师食谱中,我需要在传递给模板erb之前将其转换为集合。我该怎么做? 最佳答案 此模式适用于Set、Matrix、JSON等;这是尝试的第一件事。require'set'nodes=['server1','server1','server2']pnodes.to_set## 关于ruby-厨师和ruby:howtoconvertaarrayintoaset,我们在StackOverflow

  8. ruby - 警告 : PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, 请参阅 : https://github. com/wayneeseguin/rvm/issues/3212 - 2

    我每次打开终端时都会收到这个错误:警告:PATH设置为RVMruby​​但未设置GEM_HOME和/或GEM_PATH,请参阅:https://github.com/wayneeseguin/rvm/issues/3212这是在我最近安装zsh(oh-my-zsh)后开始发生的我不知道如何设置GEM_HOME和/或GEM_PATH的路径。 最佳答案 我也面临同样的问题,更改.zshrc中的以下行,exportPATH="/usr/local/heroku/bin:.........."到exportPATH="$PATH:/usr/

  9. ruby-on-rails - 每当 gem : I set :output but the logfile doesn't show up where I'd expect it to - 2

    在我的schedule.rb文件中,我有以下几行:set:output,'/log/cron_log.log'every5.minutesdocommand'echo"hello"'end我按照这个问题Rails,usingwhenevergemindevelopment中的建议运行了whenever-w,并且我假设cronfile已编写并正在运行。(我也尝试重新启动Rails服务器。)当我运行$crontab-l时,我看到以下内容:0,5,10,15,20,25,30,35,40,45,50,55****/bin/bash-l-c'echo"hello">>/log/cron_log

  10. python - 用于从 Python 到 Ruby 查找集合的所有分区的翻译函数 - 2

    我有以下python函数来递归查找集合的所有分区:defpartitions(set_):ifnotset_:yield[]returnforiinxrange(2**len(set_)/2):parts=[set(),set()]foriteminset_:parts[i&1].add(item)i>>=1forbinpartitions(parts[1]):yield[parts[0]]+bforpinpartitions(["a","b","c","d"]):print(p)有人可以帮我把它翻译成ruby​​吗?这是我目前所拥有的:defpartitions(set)ifnots

随机推荐