本文为「30天吃透Python核心语法」系列第十一篇,承接Day10的元组+字典内容,全程纯文字讲解、零基础友好、无晦涩术语,每一个知识点都配可直接运行的代码示例,彻底搞定Python最后一个基础数据容器,完成四大容器知识体系闭环。
大家好,欢迎来到30天Python精通计划的第十一天。
过去三天,我们依次搞定了列表、元组、字典三大核心数据容器,解决了批量数据存储、固定数据保护、结构化数据查询的核心需求,很多同学都用这些容器写出了学生成绩管理、用户信息存储的小脚本,进步非常快!
这段时间我也收到了很多新手同学的高频提问:
- 我从Excel里导出来的列表有大量重复数据,一个个手动删除太麻烦了,有没有一行代码就能去重的方法?
- 怎么快速找出两个列表里都有的共同元素?比如两个班级的共同报名学生?
- 怎么找出只在A列表里有、B列表里没有的独有数据?用循环写太复杂了,有没有更简单的方式?
别慌,这些问题的完美解决方案,就是今天我们要学的集合(Set)。
集合是Python四大基础数据容器的最后一块拼图,它不像列表那样常用,却有着其他三个容器都无法替代的核心优势:天生自带元素去重特性,以及超高效的数学集合运算。其他容器要写十几行循环才能实现的去重、找共同元素功能,集合一行代码就能搞定,是数据清洗、批量数据对比的神器。
今天我们不仅会彻底讲透集合的所有核心用法,还会对列表、元组、字典、集合四大容器做完整的总结对比,帮你彻底理清每个容器的适用场景,形成完整的知识体系,再也不会纠结“这个数据该用什么容器存”。
学完今天的内容,你将:
✅ 彻底搞懂集合的核心特性,学会集合的定义与基础语法
✅ 掌握集合增、删、查、遍历四大核心操作,避开新手90%的报错
✅ 吃透集合的交、并、差、对称差四大数学运算,一行搞定复杂数据对比
✅ 学会用集合实现列表快速去重,解决日常办公最常用的数据清洗需求
✅ 完成四大基础数据容器的全总结,精准匹配不同场景的容器选型
✅ 为后续函数、办公自动化、数据分析打下完整的容器知识基础
一、先搞懂:什么是集合(Set)?
用一句大白话讲,集合是Python中自带去重特性的无序可变容器。
你可以把它想象成一个“无重复、无编号的收纳筐”:筐里的东西不会重复,一模一样的东西放进去只会保留一个;同时筐里的东西没有固定的编号和顺序,你不能像列表那样通过索引编号精准取出某个位置的元素。
我们拆解集合的4个核心特性,新手必须刻在脑子里,这是它和其他容器最本质的区别:
1. 元素唯一性(核心灵魂):集合里的元素绝对不会重复,哪怕你往里面放100次同一个数据,最终集合里只会保留1个,这是它实现快速去重的核心原理;
2. 无序性:集合里的元素没有固定的顺序,也没有索引编号,绝对不能像列表、元组那样通过索引取值,每次打印集合,元素的顺序都可能发生变化;
3. 可变性:集合创建完成后,可以随时新增、删除里面的元素,和列表、字典一样灵活;
4. 元素类型限制:集合里的元素必须是不可变类型,比如字符串、数字、元组,绝对不能用列表、字典这种可变类型当集合元素,否则会直接报错,这一点和字典的键规则完全一致。
二、集合的基础定义语法
集合的定义用英文大括号 {} 包裹,里面的元素之间用英文逗号分隔,这里有一个新手100%会踩的红线级坑,必须放在最前面讲:
空集合绝对不能用 {} 直接定义!
因为Python里的 {} 默认是空字典,不是空集合,想要定义空集合,必须用Python的内置函数 set() 。
下面我们用几个示例,带你掌握集合的4种常见定义方式,覆盖所有日常使用场景,代码可以直接复制运行:
python
# 1. 定义空集合【新手红线!必须用set(),不能用{}】
# 正确写法:空集合
empty_set = set()
print(empty_set)
print(type(empty_set)) # 输出set类型
# 错误写法:这是空字典,不是空集合
wrong_set = {}
print(type(wrong_set)) # 输出dict字典类型
# 2. 定义普通集合,自动去重【核心特性演示】
# 哪怕我们重复放入多个相同的元素,集合会自动去重,只保留一个
num_set = {1, 2, 2, 3, 3, 3, 4, 5}
print(num_set) # 输出:{1, 2, 3, 4, 5},重复元素全部被自动去除
# 3. 最常用场景:从列表/元组转换为集合,实现快速去重
# 这是新手日常最常用的用法,一行代码搞定列表去重
score_list = [85, 92, 78, 85, 90, 92, 88, 78]
# 列表转集合,自动去重
score_set = set(score_list)
print(score_set)
# 去重后转回列表,得到无重复的新列表
new_score_list = list(score_set)
print(new_score_list)
# 4. 定义多类型元素的集合(元素必须是不可变类型)
mix_set = {"张三", 20, 1.75, (1, 2, 3)}
print(mix_set)
# 错误示例:用列表当集合元素,会直接报错
# error_set = {1, 2, [3, 4]}
这里给新手补充一个重点:集合和字典都用大括号,怎么区分?
很简单:大括号里是 键:值 格式的,就是字典;大括号里是单个独立元素的,就是集合。
三、集合的核心操作
因为集合是无序的,没有索引,所以没有列表、元组里的修改单个元素、切片取值的操作,只有增、删、查、遍历四大类操作,下面我们逐个拆解清楚,每个方法都讲清用法、适用场景和避坑点。
1. 查:判断元素是否存在 + 遍历集合
集合不能通过索引取值,最常用的查询操作,就是判断某个元素是否在集合里,以及用for循环遍历集合里的所有元素。
① 判断元素是否存在:in / not in
这是集合最高效的操作之一,哪怕集合里有十万、百万个元素,判断元素是否存在的速度都极快,比列表的遍历判断效率高得多。
语法格式: 元素 in 集合名 ,存在返回True,不存在返回False; not in 则正好相反。
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 判断元素是否在集合里
print("苹果" in fruit_set) # 输出True
print("西瓜" in fruit_set) # 输出False
# 判断元素是否不在集合里
print("西瓜" not in fruit_set) # 输出True
② 遍历集合:for循环
集合是可迭代对象,可以直接用for循环遍历里面的每一个元素,用法和列表、元组完全一致,只是因为集合无序,遍历的顺序不固定。
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 遍历集合里的每一个元素
for fruit in fruit_set:
print(f"水果:{fruit}")
2. 增:给集合添加元素
Python给集合提供了两个新增元素的方法,分别适用于添加单个元素和批量添加多个元素的场景。
① add():添加单个元素
核心作用是在集合里添加一个新的元素,如果添加的元素已经在集合里存在,不会报错,也不会重复添加,符合集合的去重特性。
语法格式: 集合名.add(要添加的元素)
python
fruit_set = {"苹果", "香蕉", "橙子"}
# 添加单个新元素
fruit_set.add("葡萄")
print(fruit_set)
# 添加已存在的元素,集合不会有任何变化,也不会报错
fruit_set.add("苹果")
print(fruit_set)
② update():批量添加多个元素
核心作用是把一个可迭代对象(列表、元组、字符串、另一个集合)里的所有元素,逐个拆出来,添加到当前集合里,自动去重。
语法格式: 集合名.update(要添加的可迭代对象)
python
fruit_set = {"苹果", "香蕉", "橙子"}
# 批量添加列表里的多个元素
fruit_set.update(["葡萄", "西瓜", "芒果"])
print(fruit_set)
# 批量添加另一个集合里的元素
fruit_set.update({"樱桃", "蓝莓", "苹果"})
print(fruit_set)
3. 删:删除集合里的元素
Python给集合提供了4种常用的删除方法,分别适用于不同的删除场景,下面我们逐个拆解,讲清每个方法的区别和避坑点。
① remove():删除指定元素
核心作用是删除集合里的指定元素,元素存在就直接删除,元素不存在会直接报错,这是新手最容易踩的坑。
语法格式: 集合名.remove(要删除的元素)
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 删除指定元素香蕉
fruit_set.remove("香蕉")
print(fruit_set)
# 错误示例:删除不存在的元素西瓜,会直接报错
# fruit_set.remove("西瓜")
② discard():删除指定元素(新手优先推荐)
这个方法和remove()的功能完全一致,唯一的、也是最核心的区别是:如果要删除的元素不存在,不会报错,不会对集合做任何修改,比remove()更安全,新手优先推荐使用。
语法格式: 集合名.discard(要删除的元素)
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 删除存在的元素橙子
fruit_set.discard("橙子")
print(fruit_set)
# 删除不存在的元素西瓜,不会报错,集合无变化
fruit_set.discard("西瓜")
print(fruit_set)
③ pop():随机删除一个元素
核心作用是随机删除集合里的一个元素,并把被删除的元素作为返回值,因为集合无序,所以无法指定删除哪个元素,完全随机。
语法格式: 集合名.pop()
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 随机删除一个元素,并用变量接收
deleted_fruit = fruit_set.pop()
print(f"被删除的元素是:{deleted_fruit}")
print(f"删除后的集合:{fruit_set}")
④ clear():清空集合所有元素
核心作用是一次性清空集合里的所有元素,让集合变成空集合,集合本身还存在,不会被删除。
语法格式: 集合名.clear()
python
fruit_set = {"苹果", "香蕉", "橙子", "葡萄"}
# 清空集合所有元素
fruit_set.clear()
print(fruit_set) # 输出空集合set()
四、集合的核心灵魂:四大数学集合运算
这是集合最强大、最不可替代的功能,也是其他三个容器无法轻松实现的。日常工作中,我们经常需要对比两组数据:找共同数据、找独有数据、合并去重,这些需求用列表写循环要十几行代码,用集合的数学运算,一行就能搞定。
下面我们用两个班级的学生名单作为示例,逐个拆解四大核心运算,讲清每个运算的作用、语法、代码示例和实际使用场景,新手可以直接套用。
我们先定义两个基础集合,后续所有示例都基于这两个集合:
python
# 一班报名Python课程的学生
class1 = {"张三", "李四", "王五", "赵六", "孙七"}
# 二班报名Python课程的学生
class2 = {"王五", "赵六", "周八", "吴九", "郑十"}
1. 交集运算:找两个集合的共同元素
交集,就是两个集合里都存在的共同元素,也就是既在一班报名、又在二班报名的学生。
- 运算符: &
- 对应方法: 集合1.intersection(集合2)
- 适用场景:找两组数据的重复内容、共同用户、共同关注等
python
# 用&运算符找交集
common_students = class1 & class2
print(f"两个班都报名的学生:{common_students}")
# 用intersection方法实现同样的效果
common_students2 = class1.intersection(class2)
print(f"两个班都报名的学生:{common_students2}")
2. 并集运算:合并两个集合,自动去重
并集,就是把两个集合里的所有元素合并到一起,自动去除重复元素,得到两个集合所有的不重复数据,也就是两个班所有报名的学生,重复的只保留一个。
- 运算符: |
- 对应方法: 集合1.union(集合2)
- 适用场景:合并两组数据并去重、汇总全量数据
python
# 用|运算符找并集
all_students = class1 | class2
print(f"两个班所有报名的学生:{all_students}")
# 用union方法实现同样的效果
all_students2 = class1.union(class2)
print(f"两个班所有报名的学生:{all_students2}")
3. 差集运算:找只在一个集合里存在的独有元素
差集,就是只在第一个集合里存在、在第二个集合里不存在的元素,也就是只在一班报名、没在二班报名的学生。
- 运算符: -
- 对应方法: 集合1.difference(集合2)
- 适用场景:找两组数据的独有内容、排除重复数据、找差异项
这里要重点提醒:差集是有方向的, class1 - class2 和 class2 - class1 的结果完全不同,前者是只在一班的学生,后者是只在二班的学生。
python
# 只在一班报名,没在二班报名的学生
only_class1 = class1 - class2
print(f"只在一班报名的学生:{only_class1}")
# 只在二班报名,没在一班报名的学生
only_class2 = class2 - class1
print(f"只在二班报名的学生:{only_class2}")
# 用difference方法实现同样的效果
only_class1_2 = class1.difference(class2)
print(f"只在一班报名的学生:{only_class1_2}")
4. 对称差集运算:找两个集合互不重复的元素
对称差集,就是两个集合里不共同存在的元素,也就是去掉两个集合的共同元素,剩下的所有元素,相当于“并集减去交集”。
- 运算符: ^
- 对应方法: 集合1.symmetric_difference(集合2)
- 适用场景:找两组数据的差异项、排除共同内容
python
# 找两个班互不重复的学生
diff_students = class1 ^ class2
print(f"只在一个班报名的学生:{diff_students}")
# 用symmetric_difference方法实现同样的效果
diff_students2 = class1.symmetric_difference(class2)
print(f"只在一个班报名的学生:{diff_students2}")
五、四大基础数据容器全总结,选型再也不纠结
到这里,Python四大基础数据容器:列表、元组、字典、集合,我们就全部学完了。很多新手最头疼的问题,就是拿到一组数据,不知道该用哪个容器存储,这里我们用大白话,从核心符号、核心特性、适用场景三个维度,给大家做完整的总结,帮你彻底理清,一眼就能选对容器。
1. 列表(List)
- 核心符号:英文方括号 []
- 核心特性:有序、可变、元素可重复、支持索引/切片取值、兼容所有数据类型
- 适用场景:需要频繁增删改、按顺序存储的同类型批量数据,比如成绩列表、购物清单、用户名列表、需要按顺序遍历的数据集,是日常开发最常用的容器。
2. 元组(Tuple)
- 核心符号:英文小括号 () ,核心标志是逗号
- 核心特性:有序、不可变、元素可重复、支持索引/切片取值、兼容所有数据类型
- 适用场景:存储固定不变、不希望被误修改的数据,比如身份证号、出生日期、常量配置、函数多返回值,核心作用是保护数据安全。
3. 字典(Dict)
- 核心符号:英文大括号 {} ,元素是 键:值 键值对格式
- 核心特性:无序(Python3.7+保留插入顺序)、可变、键唯一不可重复、键必须是不可变类型、通过键取值而非索引
- 适用场景:存储有明确对应关系的结构化数据,比如用户信息、商品详情、配置项、接口返回数据,需要通过标签快速查找数据的场景,是结构化数据存储的首选。
4. 集合(Set)
- 核心符号:英文大括号 {} ,元素是单个独立值,空集合用 set() 定义
- 核心特性:无序、可变、元素唯一不可重复、不支持索引/切片、元素必须是不可变类型
- 适用场景:数据去重、两组数据的对比运算(找共同项、差异项、独有项)、数据清洗,是批量数据处理的神器。
六、新手高频踩坑避坑指南
这里整理了Day11学集合时,新手100%会遇到的报错和逻辑问题,提前讲清原因和解决方法,帮你少走弯路。
1. 空集合定义错误,变成了空字典
很多新手直接用 {} 定义空集合,结果Python识别为字典,后续操作全部报错。解决方法:空集合必须用 set() 定义,只有带键值对的 {} 才是字典。
2. 试图用索引取值,触发TypeError报错
集合是无序的,没有索引编号,新手会像列表一样写 set[0] 取值,会直接报错。解决方法:集合不能通过索引取单个元素,要么用for循环遍历,要么用in判断元素是否存在。
3. 用可变类型当集合元素,触发TypeError报错
集合的元素必须是不可变类型,用列表、字典当集合元素会直接报错。解决方法:只能用字符串、数字、元组这种不可变类型当集合元素。
4. 用remove()删除不存在的元素,触发KeyError报错
新手用remove()删除元素前,没有先判断元素是否存在,元素不存在时程序直接崩溃。解决方法:优先用discard()方法删除元素,元素不存在也不会报错;如果要用remove(),先通过in判断元素是否存在。
5. 混淆集合和字典的大括号,导致类型错误
新手会把集合写成键值对格式,或者把字典写成单个元素格式,导致类型错误。解决方法:牢记键值对是字典,单个元素是集合,定义时先想清楚要存储的数据结构,选对容器。
6. 差集运算搞反方向,结果不符合预期
新手写差集时,搞反了两个集合的前后顺序,得到的结果完全不对。解决方法:牢记 A - B 是只在A里有、B里没有的元素,想要哪个集合的独有数据,就把哪个集合放在前面。
七、今日课后作业(必做!只看不敲,永远学不会)
编程是一门实操技能,只有动手敲代码,才能真正把集合的特性和用法吃透。今天的作业循序渐进,覆盖所有核心知识点,全部完成才算真正掌握。
1. 基础必做:定义一个包含重复数字的列表,用集合实现快速去重,把去重后的结果转回列表,分别打印去重前、去重后的列表,以及去重后列表的长度。
2. 进阶练习:定义两个集合,分别存储你和你朋友的兴趣爱好,完成以下操作:找出你们共同的爱好、找出只属于你的独有爱好、合并你们所有的爱好并去重、找出你们互不相同的爱好,把每一步的结果都打印出来。
3. 挑战练习:有两个列表,分别存储两个班级的学生姓名,用集合完成以下需求:统计两个班级一共有多少个不重复的学生、统计有多少个学生同时在两个班级、统计只在第一个班级的学生人数,把结果都打印出来。
4. 习惯养成:给每一步操作都加上清晰的单行注释,变量名用规范的蛇形命名法,做到见名知意。
八、明日预告
Day12我们将正式进入Python语法的核心进阶内容:函数基础。
我们会搞懂函数的本质、函数的定义与调用、函数的参数与返回值,学会把重复的代码封装成函数,一次编写,无限复用,让你的代码更简洁、更易维护、更专业,彻底告别重复复制粘贴代码的低效操作。
结尾互动
今天的集合与四大容器总结,你都学会了吗?
是不是终于找到了列表快速去重的简单方法,再也不用写循环一个个删重复数据了?
完成作业的同学,可以在评论区扣个【打卡Day11】!
遇到任何报错、知识点搞不懂的问题,都可以在评论区留言,我会一一解答。
关注我,跟着30天计划,从零开始,彻底精通Python核心语法,每天1.5小时,30天就能独立写Python脚本,搞定日常办公自动化!