自学Python第12天:集合------我终于能把重复的东西自动去掉了
新手向 | 2026-07-06
前面学了列表、元组、字典,每种数据容器都有自己的特点。列表可以增删改,元组不能改,字典通过键来查找值。
今天学最后一种数据容器------集合。
说实话,刚开始学的时候我没太搞懂它存在的意义。列表能存一堆东西,字典能按名字找东西,集合能干嘛?学完之后才发现,集合有两个非常实用的功能:自动去重 和快速做集合运算。
一、集合是什么
集合和列表很像,都可以存一堆数据。区别在于:
- 列表是有序的,集合是无序的
- 列表允许重复元素,集合不允许重复
在 Python 里,集合用花括号 {} 表示,和字典一样,但没有冒号:
python
# 列表用方括号,有序,可重复
fruits_list = ["苹果", "香蕉", "橙子", "苹果"]
# 集合用花括号,无序,不可重复
fruits_set = {"苹果", "香蕉", "橙子", "苹果"}
print(fruits_set) # {'苹果', '香蕉', '橙子'} 重复的苹果被去掉了
注意:集合是无序的。你定义的时候写的顺序是{"苹果", "香蕉", "橙子"},打印出来可能是{'橙子', '苹果', '香蕉'}。不能通过下标访问集合里的元素,因为它的顺序不固定。
二、一个我踩过的坑:创建空集合不能用{}
这是新手很容易犯的错误。
python
# 我想创建一个空集合
s = {}
print(type(s)) # <class 'dict'> 竟然是字典!
因为{}已经被字典占用了。要创建空集合,需要用set():
python
s = set()
print(type(s)) # <class 'set'>
三、集合的常用操作
1.添加元素:add()
python
s = {"苹果", "香蕉"}
s.add("橙子")
print(s) # {'苹果', '香蕉', '橙子'}
# 添加一个已存在的元素,不会报错,但也不会重复添加
s.add("苹果")
print(s) # {'苹果', '香蕉', '橙子'}
2.删除元素:remove()和discard()
python
s = {"苹果", "香蕉", "橙子"}
# remove:删除指定元素,不存在会报错
s.remove("香蕉")
print(s) # {'苹果', '橙子'}
# discard:删除指定元素,不存在不会报错
s.discard("葡萄") # 不会报错
3.判断元素是否在集合中:in
python
s = {"苹果", "香蕉", "橙子"}
print("苹果" in s) # True
print("葡萄" in s) # False
四、集合运算:交集、并集、差集
这是集合最强大的功能,也是它存在的核心原因。
python
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 交集:两个集合都有的元素
print(set_a & set_b) # {3, 4}
# 并集:两个集合的所有元素(去重)
print(set_a | set_b) # {1, 2, 3, 4, 5, 6}
# 差集:在 A 中但不在 B 中的元素
print(set_a - set_b) # {1, 2}
生活中的例子
python
# 班级里选课
class_a = {"张三", "李四", "王五", "赵六"} # 选了Python课的学生
class_b = {"李四", "赵六", "孙七", "周八"} # 选了Java课的学生
# 两门课都选的人(交集)
both = class_a & class_b
print(f"两门课都选的人:{both}") # {'李四', '赵六'}
# 至少选了一门课的人(并集)
all_students = class_a | class_b
print(f"至少选了一门课的人:{all_students}") # {'张三', '李四', '王五', '赵六', '孙七', '周八'}
# 只选了Python没选Java的人(差集)
only_python = class_a - class_b
print(f"只选Python的人:{only_python}") # {'张三', '王五'}
五、集合常用的场景:去重
python
# 统计一篇文章中出现了多少个不同的单词
words = ["python", "java", "python", "c", "java", "python", "go"]
unique_words = set(words)
print(unique_words) # {'python', 'java', 'c', 'go'}
print(f"总共有 {len(unique_words)} 个不同的单词") # 4
六、集合和列表的区别
| 特性 | 列表 | 集合 |
|---|---|---|
| 有序性 | 有序 | 无序 |
| 重复元素 | 允许 | 不允许 |
| 下标访问 | 支持 | 不支持 |
| 常见场景 | 按顺序存数据 | 去重、集合运算 |
七、综合示例:统计班级选课情况
把今天学的东西串起来:
python
# 班级选课数据
python_class = {"张三", "李四", "王五", "赵六", "孙七"}
java_class = {"李四", "赵六", "周八", "吴九"}
print("=== 选课统计 ===")
# 两门课都选的人
both = python_class & java_class
print(f"两门课都选的人({len(both)}人):{both}")
# 只选Python的人
only_python = python_class - java_class
print(f"只选Python的人({len(only_python)}人):{only_python}")
# 只选Java的人
only_java = java_class - python_class
print(f"只选Java的人({len(only_java)}人):{only_java}")
# 至少选了一门课的人
all_students = python_class | java_class
print(f"总选课人数({len(all_students)}人):{all_students}")
运行结果:
text
=== 选课统计 ===
两门课都选的人(2人):{'赵六', '李四'}
只选Python的人(3人):{'孙七', '张三', '王五'}
只选Java的人(2人):{'周八', '吴九'}
总选课人数(7人):{'张三', '李四', '王五', '赵六', '孙七', '周八', '吴九'}
小结
今天学的东西,整理成一张速查表:
| 知识点 | 说明 | 示例 |
|---|---|---|
| 定义集合 | 用 {} 包裹元素 | s = |
| 空集合 | 用 set() 创建 | s = set() |
| add() | 添加元素 | s.add(4) |
| remove() | 删除元素(不存在报错) | s.remove(2) |
| discard() | 删除元素(不存在不报错) | s.discard(5) |
| in | 判断元素是否存在 | 1 in s |
| & | 交集 | s1 & s2 |
| 并集 | ||
| - | 差集 | s1 - s2 |
| len() | 获取元素个数 | len(s) |
什么时候用集合?
需要去除重复数据
需要判断某个元素是否在集合中(集合的判断速度比列表快)
需要做交集、并集、差集运算
数据容器的四种类型到这里就全部学完了。本来我的计划是写一个综合案例,把前面学的内容串起来。但这几天老师开始讲新内容了------异常处理、模块、面向对象这些,我需要先跟上课程的进度,把老师讲的东西消化掉。
所以接下来的博客会跟着老师的节奏走,从异常处理和模块开始,把新学的内容一点点记录下来。
下一篇我会学习异常处理。
如果你也在学Python,欢迎在评论区告诉我你今天学到了什么,或者遇到了什么报错,一起交流!
相关文章:
- 自学Python第1天:从下载PyCharm和安装环境开始
- 自学Python第2天:敲下第一行print("Hello World"),我遇到了3个问题
- 自学Python第3天:数据类型、转换、运算符------我终于搞懂了为什么"1"和1不一样
- 自学Python第4天:字符串的三种定义方式、拼接、格式化
- 自学Python第5天:数据输入(input语句)、布尔类型、比较运算符和逻辑运算符
- 自学Python第6天:if判断、if-else、if-elif-else和嵌套判断
- 自学Python第7天:for循环和while循环------我终于让程序能重复做一件事了
- 自学Python第8天:函数------我终于能把重复的代码"打包"起来了
- 自学Python第9天:列表------我终于能把一堆东西放在一起了
- 自学Python第10天:元组和切片------我终于搞懂了什么是"不可变的列表"
- 自学Python第11天:字典------我终于能让程序像查字典一样找东西了