惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
12. 数据类型 - 集合详解 - 少数派
2023-08-09 · via 少数派
茶桁的AI秘籍 Python-set

Hi, 大家好。我是茶桁

通过最近几节课的内容,我们已经了解到了大部分的容器类数据的特性和应用,今天这一节课是容器类数据的最后一部分。让我们今天来详细了解一下「集合」。

集合是确定的一组无序的数据的组合。注意这一句话中的几个概念:

  • 首先是「确定的」,当前集合中的元素的值是不能重复的。
  • 集合是由多个数据组合的容器类型数据
  • 集合中的数据没有先后顺序
  • 集合的作用大多数时候是为了从成员检测、从无序列中去除重复项。还有就是数学中的集合类计算,例如交集、并集、差集一集对称差集等等。

集合的定义

集合的定义和字典类数据的定义非常像,包含了三种定义方式:

  • 可以直接使用{}来定义集合
  • 可以使用set()进行集合的定义和转换
  • 使用集合推导式来完成集合的定义

⚠️ 需要注意:集合中的元素不能重复,集合中存放的数据为:Number, String, Tuple,冰冻集合

冰冻集合

在集合的定义部分,其他数据类型我们都能理解,唯独多出来一个冰冻集合似乎没有见过,也难以理解。

冰冻集合的定义,需要且仅能使用frozenset()函数来进行定义。故名思义,冰冻集合一旦定义之后,是不能进行修改的,只能做一些集合相关的运算,比如交集,差集等等。

回过头来看冰冻集合的定义函数frozenset(), 这个函数本身是一个强制转换类的函数,可以把其他任何容器类型的数据转为冰冻集合,然后参与集合运算。

# 定义一个冰冻集合
mySets = frozenset({'love', 666, 333, 2, 'a', 1, 2, 'MAMT','55IW'})

# 遍历集合
for i in mySets:
    print(i, end=", ")

---
1, 2, 55IW, love, 333, MAMT, 666, a, 

也是可以看到,打印的结果完全没有任何顺序。

冰冻集合当然也可以使用集合推导式:

res = frozenset({i<<1 for i in range(6)})
print(res)

---
frozenset({0, 2, 4, 6, 8, 10})

可以进行拷贝:

res = res.copy()
print(res)

---
frozenset({0, 2, 4, 6, 8, 10})

当然冰冻集合也可以进行集合的运算,不过这部分我们将在后面讲解集合的时候来学习。暂时我们只是对「冰冻集合」的概念有个了解就可以了。

集合的基本操作和常规函数

以往的几节,我们都是将集合的操作和函数分开来讲,而这次我们放在一起讲。其实也没其他原因,就是因为这部分的内容并没有多少,并且很容易理解。

# 定义集合
mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1}
mySets

---
{(1, 2, 3), 123, '123', 3.1415, False, True, 'abc', 'love'}

打印的结果再一次验证了集合无序,除此之外,我们可以看到打印出来的集合比我们进行定义的时候似乎少了,这又是为什么呢?

原来,在集合内布尔类型的数据其实就是0和1, True表示为1, False表示为0,而集合内的值是不能重复的,所以,布尔值和0,1就只能存在一个。

我们来尝试检测一下集合中的值,和其他容器类数据一样,我们可以直接使用for...in

# 检测集合中的值
print('123' in mySets)
print('123' not in mySets)

---
True
False

然后一样,可以使用len()检测长度:

print(len(mySets))

---
8

遍历的方法依然是用for

for i in mySets:
    print(i, type(i))

---
False <class 'bool'>
True <class 'bool'>
3.1415 <class 'float'>
(1, 2, 3) <class 'tuple'>
love <class 'str'>
abc <class 'str'>
123 <class 'int'>
123 <class 'str'>

为什么我这次会将数据类型也打印出来呢?是因为我想让大家好好记住这些类型,目前集合就只支持这些数据类型,其他的并不支持放入。比如说列表,是无法进入集合内的:

# 看看列表是否能放入
mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1,['list', 2, 3, 4, 5]}

---
TypeError: unhashable type: 'list'

可以看到报错信息提示,不支持类型:列表。

那我们如何像集合中追加元素呢?可以使用add()

# 定义集合
mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1}
res = mySets.add('茶桁')
print(mySets, '\nres:', res)

---
{False, True, 3.1415, (1, 2, 3), 'love', '茶桁', 'abc', 123, '123'} 
res: None

可以看到我们在其中追加了一个字符串茶桁, 但是我们再一次验证了集合的无序,新加入的字符串并没有和其他数据类型一样新加入的元素放在最末端。

并且我们注意到了,我用res来接收了add()的返回值,返回了一个None

除了追加之外,当然我们也可以对集合进行删除元素的处理:

res = mySets.pop()
print(mySets, '\nres:', res)

---
{True, 3.1415, (1, 2, 3), 'love', '茶桁', 'abc', 123, '123'} 
res: False

pop()删除集合内的元素是随机的,并且,会将删除的元素返回。

如果想指定删除集合中的元素有没有办法呢?其实也有,remove()discard()都可以做到,但是两者又有些区别,我们接着看代码:

# 使用remove()
res = mySets.remove('abc')
print(mySets)
res = mySets.remove('aaa')

---
{True, 3.1415, (1, 2, 3), 'love', '茶桁', 123, '123'} 
res: None
KeyError: 'aaa'

能看到,remove()确实可以删除集合内的指定元素,并给一个返回值None。不过当集合内没有此元素的时候,就会报错,提示关键词错误。

那让我们再来看看discard()

# 使用discard
mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1}
res = mySets.discard('123')
print(mySets, f'res:{res}')
res = mySets.discard('aaa')
print(mySets, f'res:{res}')

---
{False, True, 3.1415, (1, 2, 3), 'love', 'abc', 123} res:None
{False, True, 3.1415, (1, 2, 3), 'love', 'abc', 123} res:None

remove()一样,也删除了一个指定元素,并且返回了None。不同的是,当我们使用discard删除一个不存在的元素时,discard虽然没有删除任何内容,但是也没有报错。

一个个删除太麻烦了,这个集合我就想让它变成一个空集合,好办,用clear()做清空处理呗,和字典一样:

mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1}
print(mySets)
mySets.clear()
print(mySets)

---
{False, True, 3.1415, (1, 2, 3), 'love', 'abc', 123, '123'}
set()

空集合拿到了,可以放入我们喜欢的元素了。依然和字典一致,我们可以使用update:

res = mySets.update({1, 2, 3, 4, 5})
print(mySets, f'res:{res}')
res = mySets.update({2, 3, 4, 5, 6})
print(mySets, f'res:{res}')

---
{1, 2, 3, 4, 5} res:None
{1, 2, 3, 4, 5, 6} res:None

结果中显示,我们更新成功了,新添加了一些元素进入集合。那第二次添加,为什么就只有6添加进去了呢?还记得么?集合不能有重复值,就跟字典不能有重复的key一样。在字典中使用update,遇到相同key后面的value会被更新,那其实集合也是一样的,只是因为只有一个值,所以更新完不还是这个值么。

在冰冻集合的时候我们用到过一次copy, 这里我们要单独拿出来说说,因为集合中的元素都是不可变的,包括元组和冰冻集合,所以当前集合的浅拷贝并不存在深拷贝的问题。换句话说,就是不存在在拷贝后,对集合中不可变的二级容器进行操作的问题。

mySets = {123,'abc',False,'love',True,(1,2,3),0,3.1415,'123',1}
res = mySets.copy()
print(res)

---
{False, True, 3.1415, (1, 2, 3), 'love', 'abc', 123, '123'}

集合是没有deepcopy方法的。

集合的运算和检测

集合的主要运算有四种,以下将列出这四种以及他们的方法:

  • 交集 &, set.intersection(), set.intersection_update()
  • 并集 |, union(), update()
  • 差集 -, difference(), difference_update()
  • 对称差集 ^, symmetric_difference(), symmetric_difference_update()

我们先来看看符号运算:

# 先定义两个集合
mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

然后让我们先求交集&:

# 求两个集合交集
res = mySet1 & mySet2
print(res)

---
{'Python'}

求两个集合并集(求并集的时候会去除重复项)|

res = mySet1 | mySet2
print(res)

---
{'Java', 'C', 'Rust', 'C++', 'Go', 'Python', 'Ruby', 'JavaScript', 'Swift'}

求两个集合差集-

res = mySet1 - mySet2
res2 = mySet2 - mySet1
print(res)
print(res2)

---
{'Go', 'Rust', 'C++', 'Swift'}
{'Java', 'C', 'Ruby', 'JavaScript'}

这段代码结果中resres2的区别在于,resmySet1中有,而mySet2中没有, res2mySet2中有,而mySet1中没有。

求两个集合对称差集^

res = mySet1 ^ mySet2
print(res)

---
{'Java', 'C', 'C++', 'Swift', 'Rust', 'Go', 'Ruby', 'JavaScript'}

看完符号运算,我们可以再来看看函数运算

交集的运算函数为set.intersection(), set.intersection_update(), 那这两个函数又有什么区别呢?

res = mySet1.intersection(mySet2)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
{'Python'}
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

让我们先记住intersection()的结果, mySet1mySet2并没有发生变化,而返回值为两个集合相同的内容。然后我们再来看看另外一个函数:

res = mySet1.intersection_update(mySet2)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
None
mySet1:{'Python'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

首先我们就能看到,返回值为None, 并且mySet1发生了变化。也就是说,set.intersection_update()是将两者的交集重复赋值给到了头部的变量,这里就是mySet1,然后返回一个None值。

接着我们来看一下并集运算函数: union(), update()

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet1.union(mySet2)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
{'Java', 'C', 'Rust', 'C++', 'Go', 'Python', 'Ruby', 'JavaScript', 'Swift'}
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

我们首先看到了返回值,正事两个集合的并集,两个原始集合也没有发生变化。

再来看看update()

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet1.update(mySet2)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
None
mySet1:{'Java', 'C', 'Rust', 'C++', 'Go', 'Python', 'Ruby', 'JavaScript', 'Swift'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

可以很明显看到区别:返回值为None,并集的计算结果被复制给了第一个变量,这里是mySet1

再看完并集之后,就轮到差集了, 分别是这两个函数difference(),difference_update()

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet1.difference(mySet2)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
{'Go', 'Rust', 'C++', 'Swift'}
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

返回值为差集的计算结果, 这里是mySet1有的而mySet2没有的。那不用问,按照一贯的惯例, difference_update()一定是将计算结果返回给第一个变量,这回我们换一下,将mySet2换成第一个变量试试:

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet2.difference_update(mySet1)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
None
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'Ruby', 'JavaScript'}

果然就跟料想的一样,最终的计算结果赋值给了mySet2

最后当然就是对称差集函数symmetric_difference() symmetric_difference_update()

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet2.symmetric_difference(mySet1)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
{'Java', 'C', 'C++', 'Swift', 'Rust', 'Go', 'Ruby', 'JavaScript'}
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'Python', 'Ruby', 'JavaScript'}

res接收了计算结果,成为了一个新集合。

接下来,大家应该能猜到了吧?不过还是要做做实验才知道,万一和自己想的不一样呢。

mySet1 = {'Python','Go','Rust', 'Swift', 'C++'}
mySet2 = {'C','JavaScript', 'Ruby', 'Java', 'Python'}

res = mySet2.symmetric_difference_update(mySet1)
print(res)
print(f'mySet1:{mySet1}, \nmySet2:{mySet2}')

---
None
mySet1:{'Go', 'Python', 'Rust', 'C++', 'Swift'}, 
mySet2:{'Java', 'C', 'C++', 'Swift', 'Rust', 'Go', 'Ruby', 'JavaScript'}

嗯,这个结果,一点都没有惊喜和意外。

好吧,运算我们学完之后,接着我们要看看集合的检测方法, 一共有三个,记住用法就可以了:

  • issuperset() 检测是否为超集
  • issubset() 检测是否为子集
  • isdisjoint() 检测是否不相交

为了更好的说明,我们不能在用之前的集合,这回,我们定义三个集合来看:

mySet1 = {1, 2, 3, 4, 5, 6}
mySet2 = {1, 2, 3}
mySet3 = {6, 7, 8}

接下来从第一个检测开始:

print(mySet1.issuperset(mySet2))
print(mySet2.issuperset(mySet1))
print(mySet1.issuperset(mySet3))

---
True
False
False

不知道大家在数学里有没有学过「超集」的概念,我们从最后的打印结果可以看出来,mySet1mySet2的超集,反过来则不是,并且,mySet1也不是mySet3的超集。观察三个集合内的元素我们可以得出结论,如果集合a是另外一个集合b的超集,那么集合b内的元素一定在集合a中都找得到。

再来检测子集:

print(mySet1.issubset(mySet2))
print(mySet2.issubset(mySet1))
print(mySet3.issubset(mySet1))

---
False
True
False

从这个结果中我们能看到,子集的概念就和超集完全相反了。

最后就是检测两个集合是否相交了,也就是集合中的元素有没有重复的:

print(mySet1.isdisjoint(mySet2))
print(mySet2.isdisjoint(mySet1))
print(mySet3.isdisjoint(mySet1))
print(mySet2.isdisjoint(mySet3))

---
False
False
False
True

虽然前三个都打印的False, 最后一个打印的True,但是我们从集合中应该知道,只有mySet2mySet3没有相交关系。所以我们可以知道,isdisjoint()这个函数其实是检测不相交的。也就是说,返回结果为False则证明相交,返回结果为True反而是不相交。

结语

至此,随着我们的集合内容讲完,咱们的容器类数据类型就全部讲完了。

咱们下一节开始,咱们要开始行的篇章。下一节内容预告:Python中File文件的操作。

本节课一样就不布置作业了,大家好好的将最近将的容器类数据好好的回顾一下,将基础打扎实。