不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。
python系列之集合
python系列前期章节
- python系列之注释与变量
- python系列之输入输出语句与数据类型
- python系列之运算符
- python系列之控制流程语句
- python系列之字符串
- python系列之列表
- python系列之元组
- python系列之字典
一、为什么需要集合?生活中的案例
场景:统计班级同学的选修课情况
假设有三个同学选了以下课程:
# 定义几个列表
alice = ["数学", "物理", "编程"]
bob = ["物理", "化学", "编程"]
charlie = ["历史", "艺术", "编程"]
需求1:找出所有被选中的课程(不重复)
需求2:找出至少两人都选的课程
需求3:找出只有一个人选的课程
如果用列表处理这些问题会很麻烦,但用集合可以轻松解决!
二、集合的三大核心特性
-
唯一性:自动去重,每个元素只出现一次
fruits = {"苹果", "香蕉", "苹果", "橙子"} print(fruits) # 输出:{'苹果', '香蕉', '橙子'}
-
无序性:元素没有固定顺序(不能通过索引访问)
print(fruits[0]) # 报错!'set' object is not subscriptable
-
可哈希性:元素必须是不可变类型(数字、字符串、元组等)
valid_set = {1, "hello", (2, 3)} invalid_set = {[4, 5]} # 报错!列表不可哈希
三、集合的四大基础操作
1. 创建集合
# 方法1:直接定义
courses = {"数学", "物理", "编程"}
# 方法2:从列表转换(常用去重技巧)
all_courses = ["数学", "物理", "编程", "物理"]
unique_courses = set(all_courses) # {'数学', '物理', '编程'}
# 空集合要特别注意!
empty_set = set() # 正确
not_empty = {} # 错误!这是空字典
2. 增删元素(接上前实例)
# 添加元素
courses.add("化学")
# 删除元素
courses.remove("物理") # 元素不存在会报错,可用于判断
courses.discard("音乐") # 元素不存在不会报错
# 随机弹出(删除)一个元素
popped = courses.pop()
3. 成员检查(比列表快得多!)
if "编程" in courses:
print("包含编程课")
4. 遍历集合
for course in courses:
print(f"课程:{course}")
四、集合运算:用数学思维解决问题
1. 并集(Union)→ 合并两个集合的所有元素
math = {"Alice", "Bob"}
physics = {"Bob", "Charlie"}
all_students = math | physics # 符号写法
# 等价于 math.union(physics)
# 结果:{'Alice', 'Bob', 'Charlie'}
2. 交集(Intersection)→ 找出共同元素
both = math & physics
# 等价于 math.intersection(physics)
# 结果:{'Bob'}
3. 差集(Difference)→ A有但B没有的元素
only_math = math - physics
# 结果:{'Alice'}
4. 对称差集(Symmetric Difference)→ 非共同元素
unique = math ^ physics
# 等价于 math.symmetric_difference(physics)
# 结果:{'Alice', 'Charlie'}
五、实战场景案例
俗话说的好:实践出真理,接下来撸起袖子开干几个案例。
案例1:好友推荐系统
需求分析:定义两个账号,里面有各自的好友数据,通过这里的数据集来查找当前账号和另一个账号的共同好友和可能认识的人(不是自己账号上的好友)
my_friends = {"小明", "小红", "小刚"}
xiaoming_friends = {"小红", "小芳", "小刚"}
# 共同好友 → 交集
common = my_friends & xiaoming_friends # {'小红', '小刚'}
# 可能认识的人 → 小明的朋友中不是我的好友
suggestions = xiaoming_friends - my_friends # {'小芳'}
案例2:电商商品筛选
需求分析:有两个用户的收藏品,通过这两个用户进行合并和对比差异性。
# 用户A的收藏
user_a = {"手机", "耳机", "充电宝"}
# 用户B的收藏
user_b = {"耳机", "笔记本", "鼠标"}
# 联合推荐(去重)
all_items = user_a | user_b # {'手机','耳机','充电宝','笔记本','鼠标'}
# 差异化推荐(互补商品)
unique_a = user_a - user_b # {'手机','充电宝'}
案例3:数据清洗去重
需求分析:传来一堆原数据,是一个列表,需要进行去重,再原路返回。
# 原始数据(含重复)
raw_data = [10, 15, 20, 15, 30, 10]
# 快速去重 → 转集合再转列表
clean_data = list(set(raw_data)) # [10, 15, 20, 30]
六、高级技巧与注意事项
1. 冻结集合(frozenset)
fixed_set = frozenset([1, 2, 3])
# 不可修改,可作为字典的键
print(fixed_set) # 输出:frozenset({1, 2, 3})
2. 集合推导式
squares = {x**2 for x in range(5)} # {0, 1, 4, 9, 16}
3. 性能优势
- 查找元素:集合O(1) vs 列表O(n)
- 适合处理需要快速判断元素是否存在的场景
七、练习题(答案见评论区,仅供参考)
-
给定两个列表:
list1 = [1, 2, 2, 3, 4] list2 = [3, 4, 5, 5]
用集合操作找出:
a) 两个列表都包含的数字
b) 所有不重复的数字
c) 只在一个列表中出现的数字 -
模拟用户标签系统:
- 用户A的标签:{“科技”, “编程”, “数码”}
- 用户B的标签:{“美食”, “编程”, “旅游”}
找出他们的共同兴趣和独特兴趣
掌握集合后,你可以轻松解决去重、关系分析、高效查找等问题。建议在实际项目中多思考:“这个问题是否能用集合简化?” 你会逐渐发现它的强大之处!