前言
Python 中的 set 集合自带高效集合运算,日常数据去重、对比两组数据差异场景超好用。 最常用的两组对比运算:差集、对称差集,很多新手容易混淆,本文分开拆解,附直观代码案例,可直接复制运行。
前置小知识:集合元素唯一、无序,用 {} / set() 创建,不支持索引取值。
一、差集(Difference):只保留A独有的元素
1. 定义
集合A减去集合B,得到只存在于A、不存在于B的元素,叫A相对于B的差集。 通俗理解:A有但B没有的数据。
2. 两种写法
3. 基础示例
# 两组学生名单
stu_a = {"张三", "李四", "王五", "赵六"}
stu_b = {"李四", "钱七", "孙八", "赵六"}
# 方式1:运算符求差集
res1 = stu_a - stu_b
# 方式2:difference方法
res2 = stu_a.difference(stu_b)
print("A独有的学生:", res1)
print("两种方法结果一致:", res1 == res2)
输出结果:
A独有的学生: {'张三', '王五'}
两种方法结果一致: True
4. 反向差集 B - A
差集不满足交换律,A-B 和 B-A 结果完全不同:
# B独有的元素
res3 = stu_b - stu_a
print("B独有的学生:", res3)
输出:
B独有的学生: {'钱七', '孙八'}
5. 实用业务场景
- 对比新旧用户列表,找出新增用户(新集合 - 旧集合)
二、对称差集(Symmetric Difference):两边各自独有的全部元素
1. 定义
合并「A独有的元素」+「B独有的元素」,同时剔除两者都有的交集元素。 大白话:只在其中一边出现,两边不共同拥有的数据。
2. 两种写法
- 内置方法:
A.symmetric_difference(B)
3. 基础示例
沿用上面学生集合:
stu_a = {"张三", "李四", "王五", "赵六"}
stu_b = {"李四", "钱七", "孙八", "赵六"}
# 对称差集两种写法
sym1 = stu_a ^ stu_b
sym2 = stu_a.symmetric_difference(stu_b)
print("两边互不相同的全部学生:", sym1)
print("方法等价:", sym1 == sym2)
输出:
两边互不相同的全部学生: {'张三', '王五', '钱七', '孙八'}
方法等价: True
逻辑拆解: A独有:张三、王五 B独有:钱七、孙八 合并 = 对称差集;李四、赵六是两边共有,直接删掉。
4. 数学等价公式
对称差集 = (A - B) | (B - A)
# 验证公式
test = (stu_a - stu_b) | (stu_b - stu_a)
print(test == sym1) # True
5. 实用业务场景
- 对比两份Excel名单,快速找出两份表里所有不一样的数据
三、差集 vs 对称差集 核心对比表
一句话区分
- 对称差集:我独有的 + 你独有的,咱俩重合的全部不要
四、综合实战完整案例(可直接复制运行)
场景:电商平台两份用户标签,筛选差异数据
# 用户1的商品标签
tag1 = {"手机", "耳机", "充电器", "充电宝"}
# 用户2的商品标签
tag2 = {"耳机", "平板", "充电宝", "键盘"}
print("===== 差集演示 =====")
print("用户1独有标签:", tag1 - tag2)
print("用户2独有标签:", tag2 - tag1)
print("\n===== 对称差集演示 =====")
print("两人完全不重合的所有标签:", tag1 ^ tag2)
print("\n===== 交集(补充对照) =====")
print("两人共同标签:", tag1 & tag2)
运行输出:
===== 差集演示 =====
用户1独有标签: {'手机', '充电器'}
用户2独有标签: {'平板', '键盘'}
===== 对称差集演示 =====
两人完全不重合的所有标签: {'手机', '充电器', '平板', '键盘'}
===== 交集(补充对照) =====
两人共同标签: {'耳机', '充电宝'}
五、文末小总结
- 对称差集 A ^ B:筛选两份数据所有互不重合内容,双向对比;
- 运算有两种写法:运算符更简洁,
.difference() / .symmetric_difference() 可读性更高; - 日常数据对比、名单校验、爬虫数据更新判断,集合运算效率远高于循环遍历列表。