查看: 123|回复: 3

Python集合运算实战:交集、并集、差集、对称差集代码详解

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
Python的集合(set)是一种无序、不重复元素的数据结构,常用于成员检测、去重和数学集合运算。与列表或元组不同,集合基于哈希表实现,查找操作的时间复杂度为O(1),因此在处理大量数据时性能优势明显。集合分为可变set和不可变frozenset两种类型,日常开发中最常用的是set。

创建集合非常简单:直接用大括号包裹元素,或使用set()函数从其他可迭代对象转换。注意空集合只能用set()创建,因为{}表示空字典。
  1. # 基本创建方式
  2. set1 = {1, 2, 3, 4, 5}
  3. set2 = set([1, 2, 3, 2, 1])  # 自动去重 -> {1, 2, 3}
  4. set3 = set("hello")          # 字符拆解 -> {'h', 'e', 'l', 'o'}
复制代码

一、四种基本集合运算

1. 交集(& / intersection())

交集返回两个集合中都包含的元素。适用于找出共同好友、满足多重条件的记录等场景。
  1. set_a = {1, 2, 3, 4, 5}
  2. set_b = {4, 5, 6, 7, 8}
  3. # 运算符方式
  4. inter_op = set_a & set_b        # {4, 5}
  5. # 方法方式(可传入多个集合)
  6. inter_method = set_a.intersection(set_b)  # {4, 5}
复制代码

2. 并集(| / union())

并集返回两个集合中所有唯一元素,常用于合并多数据源、统计全部参与用户等。
  1. set_x = {1, 2, 3}
  2. set_y = {3, 4, 5}
  3. union_op = set_x | set_y          # {1, 2, 3, 4, 5}
  4. union_method = set_x.union(set_y) # {1, 2, 3, 4, 5}
复制代码

3. 差集(- / difference())

差集返回只在第一个集合中出现、不在第二个集合中的元素。常用于找出新注册用户、未完成的任务、数据变更检测等。
  1. set_p = {1, 2, 3, 4, 5}
  2. set_q = {4, 5, 6}
  3. diff_op = set_p - set_q              # {1, 2, 3}
  4. diff_method = set_p.difference(set_q) # {1, 2, 3}
复制代码

注意:差集运算结果依赖于操作数顺序,set_p - set_q与set_q - set_p结果不同。

4. 对称差集(^ / symmetric_difference())

对称差集返回两个集合中不重复的元素,即去掉交集部分后的所有元素。适用于统计只进行单一操作的用户、找出互斥数据等。
  1. set_m = {1, 2, 3, 4}
  2. set_n = {3, 4, 5, 6}
  3. sym_op = set_m ^ set_n                     # {1, 2, 5, 6}
  4. sym_method = set_m.symmetric_difference(set_n)  # {1, 2, 5, 6}
复制代码

二、多重集合运算与比较

集合运算支持链式调用,可同时对多个集合进行运算。
  1. set1 = {1, 2, 3, 4}
  2. set2 = {3, 4, 5, 6}
  3. set3 = {4, 5, 6, 7}
  4. # 多重交集:三者共同的元素
  5. multi_inter = set1 & set2 & set3           # {4}
  6. # 多重并集:所有元素去重
  7. multi_union = set1 | set2 | set3           # {1,2,3,4,5,6,7}
  8. # 链式方法
  9. chain_inter = set1.intersection(set2).intersection(set3)  # {4}
复制代码

集合比较运算可以判断子集、超集、相等、是否不相交:
  1. set_alpha = {1, 2, 3}
  2. set_beta  = {1, 2, 3, 4, 5}
  3. set_gamma = {1, 2, 3}
  4. set_delta = {6, 7, 8}
  5. # 子集 / 真子集
  6. print(set_alpha <= set_beta)    # True
  7. print(set_alpha < set_beta)     # True
  8. # 超集 / 真超集
  9. print(set_beta >= set_alpha)    # True
  10. print(set_beta > set_alpha)     # True
  11. # 相等
  12. print(set_alpha == set_gamma)   # True
  13. # 不相交(没有共同元素)
  14. print(set_alpha.isdisjoint(set_delta))  # True
复制代码

三、实战案例:数据分析与权限管理

案例1:电商用户行为分析

通过集合运算快速筛选不同行为组合的用户群体。
  1. all_users = {'user1','user2','user3','user4','user5'}
  2. purchased = {'user1','user3','user5'}
  3. browsed   = {'user2','user3','user4'}
  4. # 购买但未浏览
  5. print(purchased - browsed)     # {'user1','user5'}
  6. # 浏览但未购买
  7. print(browsed - purchased)     # {'user2','user4'}
  8. # 既浏览又购买
  9. print(purchased & browsed)     # {'user3'}
  10. # 有任一行为
  11. print(purchased | browsed)     # {'user1','user2','user3','user4','user5'}
  12. # 只进行一种行为(对称差集)
  13. print(purchased ^ browsed)     # {'user1','user2','user4','user5'}
复制代码

案例2:数据清洗与更新

当本地数据需要与远程数据同步时,通过差集和交集可以快速定位增删记录。
  1. current = {'A','B','C','D','E'}
  2. new_data = {'C','D','E','F','G'}
  3. # 需要删除的(当前有,新数据无)
  4. to_delete = current - new_data   # {'A','B'}
  5. # 需要添加的(新数据有,当前无)
  6. to_add = new_data - current      # {'F','G'}
  7. # 保持不变
  8. unchanged = current & new_data   # {'C','D','E'}
复制代码

案例3:权限管理系统

用集合表示角色权限,升级或降级时只需简单的差集运算。
  1. admin   = {'create','read','update','delete'}
  2. editor  = {'create','read','update'}
  3. viewer  = {'read'}
  4. # 查看者升级到编辑者需添加的权限
  5. print(editor - viewer)   # {'create','update'}
  6. # 编辑者升级到管理员需添加的权限
  7. print(admin - editor)    # {'delete'}
  8. # 所有角色共有的权限
  9. print(admin & editor & viewer)  # {'read'}
复制代码

四、性能优化:成员检测与列表推导式

集合的哈希表结构使得成员检测非常快,适合海量数据下的包含判断。下面通过对比列表与集合的in操作时间,可以直观看到性能差距。
  1. import time
  2. large_list = list(range(1000000))
  3. large_set  = set(range(1000000))
  4. t1 = time.time()
  5. print(999999 in large_list)
  6. list_time = time.time() - t1
  7. t1 = time.time()
  8. print(999999 in large_set)
  9. set_time = time.time() - t1
  10. print(f"列表耗时: {list_time:.6f}s, 集合耗时: {set_time:.6f}s, 提升倍率: {list_time/set_time:.1f}")
复制代码

在不需要去重且数据量不大的场景下,也可以使用列表推导式模拟交集运算,但要注意会包含重复元素,通常需要再转成set去重。
  1. list1 = [1, 2, 3, 4, 5]
  2. list2 = [4, 5, 6, 7, 8]
  3. # 列表推导式交集(结果可能有重复,视源数据而定)
  4. inter_list = [x for x in list1 if x in list2]   # [4, 5]
  5. inter_set  = set(inter_list)                     # {4, 5}
复制代码

五、总结

Python集合运算提供了简洁、高效的数据关系处理能力。正确使用交集、并集、差集、对称差集以及比较运算,可以减少循环判断,提升代码可读性和运行效率。在数据去重、关系分析、权限管理、性能敏感场景中,优先考虑集合而非列表,往往能带来数量级的性能提升。

掌握这些基础但强大的技巧,能让你的Python代码更加Pythonic。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python集合运算实战:交集、并集、差集、对称差集代码详解

感谢楼主的详细教程,写得非常清晰,尤其是实战案例部分,把集合运算和业务场景结合得很好。我自己在数据处理中也经常用差集来比对前后两个时间点的用户列表,效率确实比循环快很多。另外想请教一下,如果数据量特别大(比如上百万个元素),链式交集运算的性能表现如何?有没有什么建议?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python集合运算实战:交集、并集、差集、对称差集代码详解

感谢楼主的详细讲解!集合运算在数据处理中确实非常实用,特别是多个集合链式操作和子集判断的示例很直观。之前我处理用户权限时就用过交集和差集来对比新旧角色,但没想过对称差集可以快速找出单边操作的用户,这个思路扩展了应用的场景。另外请教一下,frozenset是否也支持这些运算符和方法?因为有时候需要把集合作为字典的键,想确认一下不可变集合的运算兼容性。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python集合运算实战:交集、并集、差集、对称差集代码详解

感谢楼主这么详细的分享!集合运算在日常数据处理中确实非常实用,特别你提到的链式运算和多重差集,很多新手可能没想到可以这样连用。另外实战案例里的权限管理思路也很清晰,用集合来对比角色权限增删的确比循环判断简洁多了。一个小补充:集合运算虽然快,但如果元素是不可哈希的类型(比如列表)会报错,实际用的时候注意数据类型就行。再次点赞!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-3 13:01 , Processed in 0.032192 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部