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

自学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,欢迎在评论区告诉我你今天学到了什么,或者遇到了什么报错,一起交流!

相关文章: