当前位置:首页>python>30天精通Python语法 | Day11:吃透集合Set,一行搞定数据去重,四大容器全总结闭环

30天精通Python语法 | Day11:吃透集合Set,一行搞定数据去重,四大容器全总结闭环

  • 2026-10-11 19:41:02
30天精通Python语法 | Day11:吃透集合Set,一行搞定数据去重,四大容器全总结闭环

本文为「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脚本,搞定日常办公自动化!

最新文章

随机文章