当前位置: 首页 > 技术教程

Python中的集合运算有哪些? 交集、并集如何实现?

  在 Python 数据处理中,集合(set)是一种无序、不重复的可变容器,专为 “元素唯一性判断” 与 “集合间关系计算” 设计。无论是去重、筛选共同元素,还是合并数据,集合运算都能提供高效简洁的解决方案。小编将梳理 Python 集合的 6 类核心运算,重点解析交集、并集的实现方法,助你快速掌握集合在实际开发中的应用。

  一、集合的核心特性:为何适合运算?

  在学习运算前,需先明确集合的两大关键特性,这是其高效运算的基础:

  元素唯一性:集合自动去重,同一元素在集合中仅出现一次(如{1,2,2,3}会自动变为{1,2,3}),无需手动处理重复数据;

  无序性:集合不记录元素插入顺序,也不支持索引访问(如set1[0]会报错),但底层采用哈希表实现,判断元素是否存在(in操作)的时间复杂度为 O (1),远快于列表的 O (n)。

  正因为这些特性,集合在 “去重”“关系判断” 场景中效率显著,例如筛选两个列表的共同元素、合并多个数据集并去重等。

python3.png

  二、Python 集合的 6 类核心运算

  Python 集合支持数学意义上的集合运算,包括交集、并集、差集、对称差集等,每种运算均提供 “运算符” 与 “内置方法” 两种实现方式,可根据代码可读性需求选择。

  (一)交集:取两个集合的共同元素

  定义:返回同时存在于两个集合中的所有元素,数学符号为 “∩”。

  适用场景:筛选两个数据集的重叠部分,如 “找出同时购买 A 商品与 B 商品的用户 ID”。

  实现方式:

  运算符&:直接用set1 & set2计算交集,结果为新集合;

  内置方法intersection():调用set1.intersection(set2),支持传入多个集合(如set1.intersection(set2, set3)取三个集合的共同元素)。

  示例:

  TypeScript取消自动换行复制

  # 定义两个用户集合(存储用户ID)

  users_a = {101, 102, 103, 104} # 购买A商品的用户

  users_b = {103, 104, 105, 106} # 购买B商品的用户

  # 方法1:用&运算符求交集

  common_users1 = users_a & users_b

  print(common_users1) # 输出:{103, 104}

  # 方法2:用intersection()方法求交集

  common_users2 = users_a.intersection(users_b)

  print(common_users2) # 输出:{103, 104}

  # 扩展:求三个集合的交集

  users_c = {104, 105, 107}

  common_three = users_a.intersection(users_b, users_c)

  print(common_three) # 输出:{104}

  (二)并集:合并两个集合并去重

  定义:返回两个集合中所有不重复的元素,数学符号为 “∪”。

  适用场景:合并多个数据集并自动去重,如 “汇总 A、B 两个渠道的用户 ID,避免重复统计”。

  实现方式:

  运算符|:用set1 | set2合并集合,自动去重;

  内置方法union():调用set1.union(set2),同样支持传入多个集合。

  示例:

  TypeScript取消自动换行复制

  # 定义两个渠道的用户集合

  channel_x = {201, 202, 203}

  channel_y = {203, 204, 205}

  # 方法1:用|运算符求并集

  total_users1 = channel_x | channel_y

  print(total_users1) # 输出:{201, 202, 203, 204, 205}(自动去重203)

  # 方法2:用union()方法求并集

  total_users2 = channel_x.union(channel_y)

  print(total_users2) # 输出:{201, 202, 203, 204, 205}

  (三)其他常用集合运算

  除交集、并集外,以下 4 类运算也高频使用:

  差集:返回仅在第一个集合中存在的元素,用-运算符或difference()方法实现(如users_a - users_b,输出{101, 102});

  对称差集:返回仅在其中一个集合中存在的元素(即 “并集减交集”),用^运算符或symmetric_difference()方法实现(如users_a ^ users_b,输出{101, 102, 105, 106});

  子集判断:判断集合 A 是否完全包含于集合 B,用<=运算符或issubset()方法(如{103,104} <= users_a,输出True);

  超集判断:判断集合 A 是否完全包含集合 B,用>=运算符或issuperset()方法(如users_a >= {103,104},输出True)。

  三、集合运算的注意事项

  数据类型限制:集合的元素必须是 “可哈希” 类型(如整数、字符串、元组),列表、字典等不可哈希类型不能作为集合元素(如{[1,2], 3}会报错);

  运算结果为新集合:所有集合运算(如&、|、intersection())均返回新集合,不会修改原集合。若需直接修改原集合,可使用 “增强运算符” 或对应 “更新方法”,例如:

  交集更新:set1 &= set2(等价于set1.intersection_update(set2)),直接修改set1为交集结果;

  并集更新:set1 |= set2(等价于set1.update(set2)),直接将set2的元素合并到set1中并去重;

  空集合的创建:不能用{}创建空集合({}表示空字典),需用set()创建(如empty_set = set())。

  Python 集合运算以 “高效、简洁” 为核心优势,其中交集(&/intersection())与并集(|/union())是最常用的两种运算,分别适用于 “筛选共同元素” 与 “合并去重” 场景。实际开发中,需根据代码可读性选择实现方式(运算符更简洁,方法更直观),同时注意集合元素的可哈希性与空集合的创建方式。

 


猜你喜欢