三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

自学Python第12天:集合——我终于能把重复的东西自动去掉了

自学Python第12天:集合——我终于能把重复的东西自动去掉了

自学Python第12天:集合——我终于能把重复的东西自动去掉了

新手向 | 2026-07-06

前面学了列表、元组、字典,每种数据容器都有自己的特点。列表可以增删改,元组不能改,字典通过键来查找值。

今天学最后一种数据容器——集合

说实话,刚开始学的时候我没太搞懂它存在的意义。列表能存一堆东西,字典能按名字找东西,集合能干嘛?学完之后才发现,集合有两个非常实用的功能:自动去重快速做集合运算

一、集合是什么

集合和列表很像,都可以存一堆数据。区别在于:

  • 列表是有序的,集合是无序的
  • 列表允许重复元素,集合不允许重复

在 Python 里,集合用花括号 {} 表示,和字典一样,但没有冒号:

# 列表用方括号,有序,可重复
fruits_list = ["苹果", "香蕉", "橙子", "苹果"]# 集合用花括号,无序,不可重复
fruits_set = {"苹果", "香蕉", "橙子", "苹果"}
print(fruits_set)   # {'苹果', '香蕉', '橙子'}  重复的苹果被去掉了

注意:集合是无序的。你定义的时候写的顺序是{"苹果", "香蕉", "橙子"},打印出来可能是{'橙子', '苹果', '香蕉'}。不能通过下标访问集合里的元素,因为它的顺序不固定。

二、一个我踩过的坑:创建空集合不能用{}

这是新手很容易犯的错误。

# 我想创建一个空集合
s = {}
print(type(s))   # <class 'dict'>  竟然是字典!

因为{}已经被字典占用了。要创建空集合,需要用set():

s = set()
print(type(s))   # <class 'set'>

三、集合的常用操作

1.添加元素:add()

s = {"苹果", "香蕉"}
s.add("橙子")
print(s)   # {'苹果', '香蕉', '橙子'}# 添加一个已存在的元素,不会报错,但也不会重复添加
s.add("苹果")
print(s)   # {'苹果', '香蕉', '橙子'}

2.删除元素:remove()和discard()

s = {"苹果", "香蕉", "橙子"}# remove:删除指定元素,不存在会报错
s.remove("香蕉")
print(s)   # {'苹果', '橙子'}# discard:删除指定元素,不存在不会报错
s.discard("葡萄")   # 不会报错

3.判断元素是否在集合中:in

s = {"苹果", "香蕉", "橙子"}
print("苹果" in s)   # True
print("葡萄" in s)   # False

四、集合运算:交集、并集、差集**

这是集合最强大的功能,也是它存在的核心原因。

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}

生活中的例子

# 班级里选课
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}")   # {'张三', '王五'}

五、集合常用的场景:去重

# 统计一篇文章中出现了多少个不同的单词
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_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}")

运行结果:

=== 选课统计 ===
两门课都选的人(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天:字典——我终于能让程序像查字典一样找东西了
← 返回列表