Python集合运算:从基础到进阶全解析
Python基础:集合运算进阶
文章目录
- Python基础:集合运算进阶
- 一、知识点详解
- 1.1 集合运算(运算符 vs 方法)
- 1.2 集合运算符优先级
- 1.3 集合关系判断方法
- 1.4 方法对比
- 二、说明示例
- 2.1 权限管理系统
- 2.2 数据去重与差异分析
- 2.3 数学运算应用
- 三、学习总结
- 四、扩展知识
- 不可变集合 `frozenset`
- 4.1 `frozenset`特性
- 4.2 创建`frozenset`
- 4.3 `frozenset`应用场景
- 五、知识点考察题
一、知识点详解
1.1 集合运算(运算符 vs 方法)
集合运算可类比数学中的集合操作,是数据分析、权限管理等场景的核心工具。
运算类型 | 运算符 | 对应方法 | 功能描述 |
---|---|---|---|
并集 | | | union() | 合并两集合所有元素(自动去重) |
交集 | & | intersection() | 获取两集合的共有元素 |
差集 | - | difference() | 保留 A中存在但B中不存在 的元素 |
对称差集 | ^ | symmetric_difference() | 获取两集合的 独有元素之和(即不同时存在的元素) |
运算符与方法的区别:
- 运算符方式更简洁,但只能用于两个集合之间的运算
- 方法形式支持多集合操作,如
A.union(B, C, D)
- 方法可以链式调用,如
A.intersection(B).difference(C)
示例:
# 集合运算
A={1,2}
B={2,3}# 并集 → 合并两集合所有元素(自动去重)
# 使用运算符
print(A | B) # 输出:{1,2,3}
# 使用方法
print(A.union(B)) # 输出:{1,2,3} # 交集 → 获取两集合的共有元素
print(A & B) # 输出:{2}
print(A.intersection(B)) # 输出:{2}# 差集 → 保留A中存在但B中不存在的元素
print(A - B) # 输出:{1}
print(A.difference(B)) # 输出:{1}
print(B - A) # 输出:{3}
print(B.difference(A)) # 输出:{3}# 对称差集 → 获取两集合的独有元素之和
print(A ^ B) # 输出:{1,3}
print(A.symmetric_difference(B)) # 输出:{1,3}# 多集合运算示例
A = {1, 2, 3}
B = {3, 4, 5}
C = {5, 6, 7}# 三集合并集
union_result = A.union(B, C) # {1,2,3,4,5,6,7}# 三集合交集
intersection_result = A.intersection(B, C) # 空集(无共有元素)# 链式调用示例
result = A.union(B).difference(C) # {1,2,3,4}
1.2 集合运算符优先级
从高到低
排序(同级运算符按从左到右
顺序计算):
优先级 | 运算符 | 名称 | 示例 |
---|---|---|---|
1 | - | 差集 | A - B |
2 | & | 交集 | A & B |
3 | ^ | 对称差集 | A ^ B |
4 | | | 并集 | A | B |
5 | == , != | 相等比较 | A == B |
6 | <= , < | 子集判断 | A <= B |
7 | >= , > | 超集判断 | A >= B |
注意:进行混合运算时, 有( )时应先进行( )内运算
# 混合运算的陷阱演示
result = {1,2,3} - {2} & {3} # 实际等价于 ({1,2,3} - {2}) & {3}
print(result) # 输出:{3}# 推荐写法(显式括号)
result = ({1,2,3} - {2}) & {3} # 意图清晰
优先级记忆口诀:
"先差后交再对称,最后并集别忘记,不确定时就加括号!"
1.3 集合关系判断方法
集合关系判断用于分析多个数据集之间的包含、重叠或独立关系,是数据分析与系统开发中的高频操作。
以下是核心方法分类:
方法名 | 运算符等价 | 功能描述 |
---|---|---|
issubset() | <= | 判断当前集合是否为另一集合的子集(所有元素均在目标集合中存在) |
issuperset() | >= | 判断当前集合是否为另一集合的超集(包含目标集合的所有元素) |
isdisjoint() | 无 | 判断两集合是否无交集(无共同元素) |
intersection() | & | 返回两集合的交集(共同元素),支持多集合操作 |
方法详解:
issubset()
:子集判断
功能:验证集合A的所有元素是否都存在于集合B中。
语法:A.issubset(B)
或A <= B
或A < B
(真子集)
示例:A = {1, 2} B = {1, 2, 3, 4}print(A.issubset(B)) # 输出:True print(A <= B) # 输出:True print(A < B) # 输出:True(A是B的真子集)C = {1, 2} print(C <= C) # 输出:True(自己是自己的子集) print(C < C) # 输出:False(不是真子集)
- 应用场景:
权限验证:检查用户权限是否为所需权限的子集
数据包含关系:验证一个数据集是否完全包含在另一个数据集中
issuperset()
:超集判断
功能:验证集合A是否包含集合B的所有元素。
语法:A.issuperset(B)
或A >= B
或A > B
(真超集)
示例:A = {1, 2, 3, 4} B = {1, 2}print(A.issuperset(B)) # 输出:True print(A >= B) # 输出:True print(A > B) # 输出:True(A是B的真超集)
- 易错点:
issuperset()
与 “补集” 概念无关,仅判断包含关系
>
表示真超集,即 A 包含 B 的所有元素且 A 不等于 B
isdisjoint()
:不相交判断
功能:判断两集合是否无共同元素。
语法:A.isdisjoint(B)
示例:A = {1, 2, 3} B = {4, 5, 6} C = {3, 4, 5}print(A.isdisjoint(B)) # 输出:True(没有共同元素) print(A.isdisjoint(C)) # 输出:False(有共同元素3)
- 特性:
可接受任意可迭代对象参数(如列表、元组),无需显式转换为集合,比计算交集更高效。 - 应用场景:黑名单过滤、敏感词检测、冲突检测。
intersection()
:交集计算
功能:返回两集合的共有元素。
语法:A.intersection(B)
或A & B
扩展应用:
支持多集合操作:A.intersection(B, C)
可用于替代isdisjoint()
:若交集为空,则两集合不相交。
示例:A = {1, 2, 3} B = {3, 4, 5} print(A.intersection(B)) # 输出:{3} print(A & B) # 输出:{3}
- 集合相等判断
集合相等判断也是集合关系判断的重要部分,用于判断两个集合是否包含完全相同的元素(顺序不重要)。
语法:== 和 !=
示例:A = {1, 2, 3} B = {3, 2, 1} C = {1, 2, 4}print(A == B) # 输出:True(元素相同,顺序不重要) print(A != C) # 输出:True
1.4 方法对比
需求 | 推荐方法 | 理由 |
---|---|---|
快速判断是否有共同元素 | isdisjoint() | 高效,直接返回布尔值 |
多集合交集计算 | intersection() | 支持多参数,返回具体交集元素 |
验证严格子集关系 | < 运算符 | 严格子集(A是B的真子集)需用运算符< ,而非issubset() |
动态数据关系判断 | 运算符(& , <= ) | 代码更简洁,适合链式操作 |
二、说明示例
2.1 权限管理系统
# 定义角色权限集合
admin_perms = {"删除", "编辑", "查看"}
user_perms = {"编辑", "查看"}
guest_perms = {"查看"}# 当前用户 = 普通用户权限(user_perms)
current_user = user_perms# 验证用户权限
print("能删除吗? : ", "删除" in current_user) # 输出:False
print("能编辑么? : ", "编辑" in current_user) # 输出:True
2.2 数据去重与差异分析
# 两日商品销售数据
sales_day1 = {"手机", "耳机", "充电宝"}
sales_day2 = {"耳机", "笔记本", "鼠标"}# 合并两日所有商品(并集)
all_products = sales_day1 | sales_day2 # 输出:{'手机','耳机','充电宝','笔记本','鼠标'}# day2相交day1新增商品(差集)
new_products = sales_day2 - sales_day1 # 输出:{'笔记本','鼠标'}
2.3 数学运算应用
# 定义 男生爱好 和 女生爱好
hobbies_boy = {"篮球", "游戏", "音乐"}
hobbies_girl = {"购物", "音乐", "追剧"}# 交集:共同爱好
common_hobbies = hobbies_boy & hobbies_girl
print("共同爱好:", common_hobbies) # 输出:{'音乐'}# 差集:男生特有爱好
boy_only = hobbies_boy - hobbies_girl
print("男生特有:", boy_only) # 输出:{'篮球', '游戏'}# 对称差集:男女生各自独有爱好
unique_hobbies = hobbies_boy ^ hobbies_girl
print("独有爱好:", unique_hobbies) # 输出:{'篮球', '游戏', '购物', '追剧'}
三、学习总结
3.1 集合四大基础运算
-
并集(
|
或union()
):合并所有元素并自动去重,常用于数据整合 -
交集(
&
或intersection()
):获取多个集合共有元素,适合找共同特征 -
差集(
-
或difference()
):保留当前集合独有的元素,用于数据差异分析 -
对称差集(
^
或symmetric_difference()
):收集非共有元素之和,适用于差异对比简单理解:交集用于
找共同点
,并集用于合并数据
,差集用于筛选差异
,对称差集用于找独有元素
3.2 运算符与方法的选用原则
- 运算符(如
| & - ^
):代码简洁,建议用于两个集合的快速操作 - 方法调用(如
union()
):支持多个集合运算和链式操作(如A.union(B).difference(C)
)
3.3 集合关系判断要点
- 包含验证:
issubset()/<=
判断子集,issuperset()/>=
判断超集 - 严格包含:
<
表示真子集,>
表示真超集(要求元素完全包含且集合不等) - 冲突检测:
isdisjoint()
快速判断两集合是否无交集
四、扩展知识
不可变集合 frozenset
frozenset
是集合的不可变版本,创建后无法修改
,但支持集合运算和成员检测。
4.1 frozenset
特性
-
不可变性:创建后无法修改,尝试修改会引发
AttributeError
fs = frozenset([1, 2]) fs.add(3) # 报错:AttributeError
-
哈希性:可作为字典的键或其他集合的元素(普通集合不可)
# 合法用法 data = {frozenset({1,2}): "value"}# 非法用法(普通集合不可哈希) invalid = {{1,2}: "value"} # TypeError
-
内存占用:因不可变特性,内存占用通常比普通集合小
4.2 创建frozenset
# 从列表创建
fs1 = frozenset([1, 2, 3])# 从字符串创建(字符拆分)
fs2 = frozenset("hello") # frozenset({'h','e','l','o'})# 空集合
empty_fs = frozenset()# 从字典创建(获取键)
d = {"a":1, "b":2}
fs3 = frozenset(d) # frozenset({'a','b'})
易错点:
- 非法操作:
frozenset
不支持add()
、remove()
、pop()
等修改操作。 - 元素限制:元素必须是不可变类型(如列表
[1,2]
不可作为元素)。
4.3 frozenset
应用场景
# 1.作为字典键存储配置信息
config = {frozenset(["host", "port"]): "数据库连接配置",frozenset(["user", "password"]): "用户认证信息"
}# 2.需要保证数据不被修改的场景
CONSTANTS = frozenset(["MAX_LIMIT", "TIMEOUT", "RETRIES"])# 3.嵌套集合中的元素
nested_set = {frozenset({1,2}), frozenset({3,4})}# 4. 支持数学运算(并、交、差集等运算)
fs1 = frozenset({1,2})
fs2 = frozenset({2,3})
print(fs1 & fs2) # → {2}
五、知识点考察题
A = {1, 2, 3}
B = {1, 2}
以下哪个选项可以判断集合A包含集合B的所有元素且A≠B?( )❓
- A.
A.issubset(B)
- B.
A < B
- C.
A.issuperset(B)
- D.
A > B
相关文章:
Python集合运算:从基础到进阶全解析
Python基础:集合运算进阶 文章目录 Python基础:集合运算进阶一、知识点详解1.1 集合运算(运算符 vs 方法)1.2 集合运算符优先级1.3 集合关系判断方法1.4 方法对比 二、说明示例2.1 权限管理系统2.2 数据去重与差异分析2.3 数学运算…...
jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞
1. 信号处理与桩代码(Stub) 当线程访问安全点轮询页(Polling Page)时: 触发 SIGSEGV 信号:访问只读的轮询页会引发 SIGSEGV 异常。信号处理函数:pd_hotspot_signal_handl…...

YOLOv7训练时4个类别只出2个类别
正常是4个类别: 但是YOLOv7训练完后预测总是只有两个类别: 而且都是LFM和SFM 我一开始检查了下特征图大小,如果输入是640*640的话,三个尺度特征图是80*80,40*40,20*20;如果输入是416*416的话,三个尺度特征…...

【论文阅读】针对BEV感知的攻击
Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章,针对基于BEV的目标检测算法进行了两类可靠性分析,即恶劣自然条件以及敌对攻击。同时也提出了一…...
18.中介者模式:思考与解读
原文地址:中介者模式:思考与解读 更多内容请关注:深入思考与解读设计模式 引言 在软件开发中,尤其是处理多个对象交互时,你是否遇到过一个问题:当多个对象需要互相通信时,系统变得复杂,难以管…...

flutter 配置 安卓、Ios启动图
android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…...

基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析
一、引言 在信息爆炸的时代,假新闻的传播对社会产生了诸多负面影响。如何快速、准确地识别假新闻成为了重要的研究课题。本文将对比传统机器学习算法(朴素贝叶斯)与深度学习模型(LSTM)在假新闻检测任务中的性能表现&am…...

【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值
⭐️个人主页:小羊 ⭐️所属专栏:LeetCode 热题 100 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置搜索旋转排序数组寻找旋转排序数组中的最小值…...

副业小程序YUERGS,从开发到变现
文章目录 我为什么写这个小程序网站转小程序有什么坑有什么推广渠道个人开发者如何变现简单介绍YUERGS小程序给独立开发者一点小建议 我为什么写这个小程序 关注我的粉丝应该知道,我在硕士阶段就已经掌握了小程序开发技能,并写了一个名为“约球online”…...
计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)
EMD-VMD-LSTM 一、完整代码实现二、代码结构解析三、关键参数说明四、性能优化建议五、工业部署方案以下是用Python实现EMD-VMD-LSTM时间序列预测的完整代码,结合经验模态分解(EMD)、变分模态分解(VMD)与LSTM深度学习模型,适用于复杂非平稳信号的预测任务。代码包含数据生…...

基于LLM合成高质量情感数据,提升情感分类能力!!
摘要:大多数用于情感分析的数据集缺乏意见表达的上下文,而上下文对于理解情绪往往至关重要,并且这些数据集主要局限于几种情绪类别。像 GPT-4 这样的基础大型语言模型(Foundation Large Language Models,LLMsÿ…...

网络检测工具InternetTest v8.9.1.2504 单文件版,支持一键查询IP/DNS、WIFI密码信息
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/295e068b79314 【本章下载二】:https://pan.xunlei.com/s/VOQDXguH0DYPxrql5y2zlkhTA1?pwdg2nx# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
SpringBoot中使用Flux实现流式返回的技术总结
背景 近期在使用deepseek/openai等网页和APP时,发现大模型在思考和回复时,内容是一点点的显示出来的,于是好奇他们的实现方式。经调研和使用开发者工具抓取请求,每次聊天会向后台发送一个http请求,而这个接口跟普通接…...

【网络编程】十、详解 UDP 协议
文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定?一个进程是否可以绑定多个端口号? 4、部分常见指令…...
从零开始理解Jetty:轻量级Java服务器的入门指南
目录 一、Jetty是什么?先看一个生活比喻 二、5分钟快速入门:搭建你的第一个Jetty服务 步骤1:Maven依赖配置 步骤2:编写简易Servlet(厨房厨师) 步骤3:组装服务器(餐厅开业准备&am…...
python05——循环结构
1、while循环 n0 #初始条件 while n<5: #判断print(hello python) #要重复执行的代码print(n) #注意同级代码缩进相同n1 #计数器结果: hello python 0 hello python 1 hello python 2 hello python 3 hello python 4 hello python 5 #求阶乘和 sum0 n1 whil…...
windows触摸板快捷指南
以下是结构化整理后的触控手势说明,采用清晰的层级划分和标准化表述: **触控手势操作规范****1. 单指操作****2. 双指操作****3. 三指操作****4. 四指操作** **优化说明:** 触控手势操作规范 1. 单指操作 手势功能描述等效操作单击滑动选择…...
STM32 ADC 模数转换器详解:原理、配置与应用
STM32 ADC 模数转换器详解:原理、配置与应用 在嵌入式系统中,模数转换(ADC)是实现传感器信号采集、信号处理等任务的关键环节。STM32 微控制器作为一款功能强大的 32 位微控制器,其内置的 ADC 模块为开发者提供了高效…...

[目标检测] YOLO系列算法讲解
前言 目标检测就是做到给模型输入一张图片或者视频,模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别,而当前最热门的目标检测的模型也就是YOLO系列了。 YOLO系列的模型的提出,是为了解决当时目标检测的模型帧率太低而提…...
React 中,闭包陷阱
文章目录 前言1. 经典闭包陷阱示例过期状态问题 2. 解决方案2.1 正确声明依赖数组2.2 使用 useRef 捕获最新值**2.3 使用函数式更新(针对状态更新)****2.4 使用 useCallback 冻结闭包** **3. 异步操作中的闭包陷阱****事件监听示例** **4. 自定义 Hooks …...

.NET NativeAOT 指南
目录 1. 引言 2. 什么是 .NET NativeAOT? 2.1 NativeAOT 的定义 2.2 NativeAOT 与传统 JIT 的对比 2.3 NativeAOT 的适用场景 3. NativeAOT 的核心优势 3.1 性能提升 3.2 简化部署 3.3 更小的应用体积 3.4 知识产权保护 4. NativeAOT 的基本用法 4.1 环境…...

uniapp-商城-57-后台 新增商品(弹窗属性数据添加父级)
后台增加商品,需要添加相关的数据信息,这里还要添加属性,前面已经对相关的界面布局继续了编写。这里还要对页面添加的数据,置入到云数据库,继续永久保存,便于后期的使用。这里主要是讲属性数据 父级信息的添…...

摩方 12 代 N200 迷你主机(Ubuntu 系统)WiFi 抓包环境配置教程
摩方12代N200迷你主机标配 Intel AX201无线网卡,支持 WiFi 6 协议(802.11ax)及蓝牙5.2。此网卡兼容主流抓包工具,但需注意: 驱动兼容性:Ubuntu 20.04及以上内核版本(5.4)默认支持AX2…...
matlab多智能体网络一致性研究
一个基于连续时间多智能体系统(Multi-Agent Systems, MAS)的一阶一致性协议的MATLAB仿真代码,包含网络拓扑建模、一致性协议设计和收敛性分析。代码支持固定拓扑和时变拓扑,适用于学术研究。 1. 基础模型与代码框架 (1) 网络拓扑…...

Unity(URP渲染管线)的后处理、动画制作、虚拟相机(Virtual Camera)
一、URP渲染管线 渲染管线是一系列渲染操作的集合,Unity提供了内置渲染管线(Built-In)和可编程渲染管线(SRP)两类渲染管线。内置渲染管线是Unity的默认渲染管线,其自定义选项有限。而可编程渲染管线可以通…...
C语言:在 Win 10 上,gcc 如何编译 gtk 应用程序
在 Windows 10 上使用 g(或 gcc)编译基于 GTK 的 C 语言程序是完全可行的,且相比 Tcc 更为推荐,因为 g(GNU 编译器套件)对 GTK 的支持更加完善,配置也更简单。以下是详细步骤和注意事项…...
阿里云CMH镜像迁移与SMC整机迁移对比及功能详解(同地域跨主体账号场景)
文章目录 一、核心功能对比二、CMH镜像迁移操作流程1.资源调研2.镜像共享3.迁移验证4.限制: 三、SMC整机迁移操作流程1.迁移源导入2.任务配置3.增量同步4.应用验证…...
用vue和go实现登录加密
前端使用CryptoJS默认加密方法: var pass CryptoJS.AES.encrypt(formData.password, key.value).toString()使用 CryptoJS.AES.encrypt() 时不指定加密模式和参数时,CryptoJS 默认会执行以下操作 var encrypted CryptoJS.AES.encrypt("明文&quo…...
政府数据开放试点企业如何抢占特许经营协议黄金席位
首席数据官高鹏律师团队 《中共中央办公厅 国务院办公厅关于 加快公共数据资源开发利用的意见》的落地,标志着数据从“封闭管理的行政资源”正式转变为“可流通的市场要素”。但机遇与风险从来是一枚硬币的两面——特许经营协议的黄金席位背后,隐藏着…...
CSS 锚点滑动效果的技术
CSS 锚点滑动效果的技术 引言 介绍锚点滑动效果的概念及其在网页设计中的重要性。简要说明 基本锚点链接 如何使用HTML中的<a>标签创建基本的锚点链接。示例代码: <a href"#section1">跳转到第一部分</a> <div id"section…...