当前位置:首页>python>Python集合差集、对称差集详解|通俗易懂带实战案例

Python集合差集、对称差集详解|通俗易懂带实战案例

  • 2026-09-18 13:49:42
Python集合差集、对称差集详解|通俗易懂带实战案例

前言

Python 中的 set 集合自带高效集合运算,日常数据去重、对比两组数据差异场景超好用。 最常用的两组对比运算:差集、对称差集,很多新手容易混淆,本文分开拆解,附直观代码案例,可直接复制运行。

前置小知识:集合元素唯一、无序,用 {} / set() 创建,不支持索引取值。

一、差集(Difference):只保留A独有的元素

1. 定义

集合A减去集合B,得到只存在于A、不存在于B的元素,叫A相对于B的差集。 通俗理解:A有但B没有的数据。

2. 两种写法

  1. 运算符:A - B(简洁推荐)
  2. 内置方法:A.difference(B)

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. 实用业务场景

  1. 对比新旧用户列表,找出新增用户(新集合 - 旧集合)
  2. 筛选只买过A商品、没买过B商品的客户
  3. 筛选两个名单中只属于一方的数据

二、对称差集(Symmetric Difference):两边各自独有的全部元素

1. 定义

合并「A独有的元素」+「B独有的元素」,同时剔除两者都有的交集元素。 大白话:只在其中一边出现,两边不共同拥有的数据。

2. 两种写法

  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. 实用业务场景

  1. 对比两份Excel名单,快速找出两份表里所有不一样的数据
  2. 对比前后两次爬虫结果,找出新增+消失的数据
  3. 校验两份标签列表,找出两边独有的标签

三、差集 vs 对称差集 核心对比表

运算
符号
作用
核心特点
差集
A - B
只取A独有元素
单向,A减B≠B减A
对称差集
A ^ B
取A、B各自独有全部元素
双向交换,A^B=B^A

一句话区分

  • 差集:我有你没有
  • 对称差集:我独有的 + 你独有的,咱俩重合的全部不要

四、综合实战完整案例(可直接复制运行)

场景:电商平台两份用户标签,筛选差异数据

# 用户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独有标签: {'平板', '键盘'}

===== 对称差集演示 =====
两人完全不重合的所有标签: {'手机', '充电器', '平板', '键盘'}

===== 交集(补充对照) =====
两人共同标签: {'耳机', '充电宝'}

五、文末小总结

  1. 差集 A - B:筛选仅属于A的数据,单向对比;
  2. 对称差集 A ^ B:筛选两份数据所有互不重合内容,双向对比;
  3. 运算有两种写法:运算符更简洁,.difference() / .symmetric_difference() 可读性更高;
  4. 日常数据对比、名单校验、爬虫数据更新判断,集合运算效率远高于循环遍历列表。

最新文章

随机文章