Python3 集合
Python3 集合(Set)
🎯 学习目标
掌握 Python 中集合(set
)的定义、操作方法及实际应用场景,理解其无序性、唯一性与数学集合运算特性。能够在项目中灵活使用集合进行去重、交并差计算和高效查找操作。
🔑 核心重点
分类 | 内容 |
---|---|
基本结构 | 使用 {} 或 set() 创建集合 |
特性 | 无序、不可变元素、自动去重 |
操作方法 | 并集、交集、差集、对称差集、子集判断等 |
实际应用场景 | 数据去重、集合运算、快速查找、关系判断 |
性能优化技巧 | 使用集合代替列表进行成员判断(O(1) vs O(n)) |
📚 详细讲解
一、什么是集合?
集合(set
)是 Python 中一种用于存储不重复元素的无序容器类型。它非常适合用于集合运算(如交集、并集)和快速查找操作。
✅ 定义方式:
s1 = {1, 2, 3}
s2 = set([2, 3, 4]) # 从列表创建
s3 = set("hello") # {'h', 'e', 'l', 'o'} 自动去重
s4 = set() # 空集合
📌 特点:
- 元素不可重复
- 无插入顺序(Python 3.7+ 保持插入顺序仅限字典)
- 支持数学集合运算
- 成员查找效率高(哈希表实现)
二、集合的基本操作
✅ 1. 添加元素
s = {1, 2}
s.add(3)
print(s) # 输出:{1, 2, 3}
⚠️ 若添加已存在的元素不会报错
✅ 2. 删除元素
s.remove(2) # 若元素不存在会抛出 KeyError
s.discard(5) # 不会抛出异常
s.pop() # 随机删除一个元素
s.clear() # 清空集合
三、集合常用方法与运算符
运算 | 方法/符号 | 描述 |
---|---|---|
并集 | `s1 | s2或 .union()` |
交集 | s1 & s2 或 .intersection() |
同时出现在两个集合中的元素 |
差集 | s1 - s2 或 .difference() |
出现在 s1 但不在 s2 的元素 |
对称差集 | s1 ^ s2 或 .symmetric_difference() |
只出现在其中一个集合中的元素 |
是否子集 | s1 <= s2 或 .issubset() |
判断 s1 是否是 s2 的子集 |
是否超集 | s1 >= s2 或 .issuperset() |
判断 s1 是否包含 s2 的所有元素 |
是否没有交集 | s1.isdisjoint(s2) |
判断两个集合是否没有共同元素 |
✅ 示例:
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b) # {1, 2, 3, 4}
print(a & b) # {2, 3}
print(a - b) # {1}
print(a ^ b) # {1, 4}
print(a <= b) # False
四、集合推导式(Set Comprehensions)
类似列表推导式,但结果是一个集合。
squares = {x**2 for x in range(6)}
print(squares)
# 输出:{0, 1, 4, 9, 16, 25}
📌 可用于快速去重:
nums = [1, 2, 2, 3, 3, 3]
unique_nums = {x for x in nums}
print(unique_nums) # {1, 2, 3}
五、集合与可变性
集合本身是可变对象,不能作为其他集合的元素。如果需要不可变集合,可以使用 frozenset
。
✅ 示例:
fs = frozenset([1, 2, 3])
s = {fs, 4, 5} # 正确:frozenset 可以作为集合元素
⚠️ 注意事项
- 集合是无序的,不能依赖元素顺序
- 集合只允许不可变元素(如
int
,str
,tuple
),不能包含list
或dict
- 成员查找效率远高于列表(O(1) vs O(n))
- 若需频繁判断是否存在某值,优先使用集合而非列表
- 使用集合进行数据清洗或关系判断非常高效
🧪 实际案例分析
📌 场景:统计用户访问网站页面的唯一记录
假设我们有一个日志文件,每行记录了一个用户的访问页面路径。我们需要统计每个用户访问了哪些不同的页面。
logs = [
("Alice", "/home"),
("Bob", "/about"),
("Alice", "/contact"),
("Charlie", "/home"),
("Alice", "/home")
]
from collections import defaultdict
user_pages = defaultdict(set)
for user, page in logs:
user_pages[user].add(page)
for user, pages in user_pages.items():
print(f"{user} 访问了 {len(pages)} 个不同页面:{pages}")
📌 输出示例:
Alice 访问了 2 个不同页面:{'/contact', '/home'}
Bob 访问了 1 个不同页面:{'/about'}
Charlie 访问了 1 个不同页面:{'/home'}
📌 应用:
- 用户行为分析
- 日志处理与数据清洗
- 去重统计
- 关系型数据判断(如共同好友)
🧩 拓展练习(动手实践)
- 编写函数
common_elements(list_of_sets)
,接收多个集合组成的列表,返回它们的交集。 - 输入一组学生成绩数据,统计至少一门课程不及格的学生名单(用集合判断)。
- 实现一个程序,读取两个文本文件,输出它们的共有单词(忽略大小写和标点)。
- 使用集合模拟“共同关注”功能,找出两个用户的共同好友。
- 编写程序,将一个长字符串拆分为单词集合,并统计唯一词数。
📚 推荐阅读
- Python 官方文档 - 集合
- 《流畅的 Python》第 3 章 - 集合与散列
- 廖雪峰 Python 教程 - 集合
- 菜鸟教程 - Python 集合
- Real Python - Sets in Python
🧭 下一步建议
- 下一章学习内容:《Python 字符串操作详解》
- 掌握字符串格式化、拼接、替换、正则表达式等高级操作
- 学习 f-string、
str.format()
、模板字符串等新特性 - 探索字符串在文件处理、网络请求、数据解析中的应用
- 结合集合与字符串知识,尝试编写高效的文本处理工具
如果你希望我为你提供:
- Python 集合常用方法速查表 PDF
- 更多实战项目练习题(如共同好友检测、网页去重器、关键词提取等)
- 集合推导式高级用法详解
- 集合性能调优指南(如内存占用、查找效率等)
- 视频教学资源推荐(中文讲解)
欢迎随时告诉我 😊