Python 使用集合找出两个列表的并集(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在 Python 编程中,处理数据集合的交集、并集和差集是常见的操作需求。例如,电商系统可能需要合并两个仓库的商品清单,或者数据分析时需要整合两组实验数据。本文将聚焦于“Python 使用集合找出两个列表的并集”这一主题,通过循序渐进的讲解,帮助读者掌握集合的特性、并集的实现方法,以及如何在实际场景中高效应用这一技术。
集合的基本概念与特性
什么是集合?
集合(Set)是 Python 中一种无序、可变(但元素不可变)且不包含重复元素的数据结构。它类似于数学中的集合概念,支持高效的成员检测、交集、并集和差集等操作。与列表(List)相比,集合的主要优势在于:
- 无序性:元素不按特定顺序存储;
- 唯一性:自动去重,无法存储重复值;
- 高效性:成员检测、交并差运算的时间复杂度为 O(1) 或 O(n),远优于列表的 O(n)。
比喻:可以想象集合是一个“分类箱”,放入元素时会自动检查是否已有同类,并且不关心元素的排列顺序,只关心“是否存在”。
列表与集合的对比
列表(List)和集合(Set)在某些场景下可以互相转换。例如,若需保留元素顺序但需要去重,可以先将列表转换为集合,再转回列表:
original_list = [1, 2, 2, 3, 4]
unique_list = list(set(original_list)) # 输出:[1, 2, 3, 4](顺序可能变化)
但需注意,集合的无序性可能导致结果顺序与原始列表不同。
如何用集合找出两个列表的并集?
并集的定义与数学表达
在数学中,两个集合的并集(Union)是指所有属于集合 A 或集合 B 的元素的集合,记作 A ∪ B。例如,A = {1, 2},B = {2, 3},则 A ∪ B = {1, 2, 3}。
Python 实现并集的两种方法
方法 1:使用 |
运算符或 union()
方法
Python 集合对象提供了 union()
方法,或直接使用 |
运算符来计算并集:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
union_result = set_a | set_b
print(union_result) # 输出:{1, 2, 3, 4, 5}
union_result = set_a.union(set_b)
print(union_result) # 同上
方法 2:手动合并并去重
若无法直接使用集合操作,可通过列表推导式合并后去重,但此方法效率较低:
list_a = [1, 2, 3]
list_b = [3, 4, 5]
merged_list = list_a + list_b # 合并后包含重复元素
unique_list = list(set(merged_list)) # 转换为集合再转回列表
print(unique_list) # 输出顺序可能不同,例如:[1, 2, 3, 4, 5]
关键点总结
- 优先使用集合操作:集合的
union()
或|
运算符是并集操作的首选方案,因其时间复杂度更低; - 结果无序性:集合的并集结果不保证元素顺序,若需保留顺序,需结合列表操作;
- 元素类型限制:集合中的元素必须是不可变类型(如整数、字符串、元组),不能包含列表等可变类型。
列表与集合的性能对比
实际案例:合并两个大型列表
假设需要合并两个包含百万级元素的列表,比较不同方法的性能差异:
import time
list1 = list(range(1000000))
list2 = list(range(500000, 1500000))
start = time.time()
set1 = set(list1)
set2 = set(list2)
result_set = set1.union(set2)
print(f"集合方法耗时:{time.time() - start:.2f} 秒")
start = time.time()
merged_list = list1 + list2
result_list = list(dict.fromkeys(merged_list)) # 使用字典保持顺序
print(f"列表方法耗时:{time.time() - start:.2f} 秒")
预期结果:集合方法通常比列表方法快数十倍,因其底层基于哈希表实现,查找和合并效率极高。
性能差异的底层原理
- 集合的哈希表结构:每个元素通过哈希函数快速定位,插入、删除和查找操作均为 O(1) 时间复杂度;
- 列表的线性结构:遍历列表检查重复元素的时间复杂度为 O(n),合并两个列表后去重的时间复杂度为 O(n²)。
实际应用场景与代码示例
案例 1:电商商品库存合并
假设某电商平台有两个仓库的库存清单,需合并为一份总库存列表:
warehouse1 = ["手机", "笔记本", "耳机", "鼠标"]
warehouse2 = ["平板", "笔记本", "键盘", "鼠标"]
total_inventory = list(set(warehouse1) | set(warehouse2))
print(total_inventory) # 输出顺序可能不同,例如:['鼠标', '耳机', '笔记本', '键盘', '手机', '平板']
案例 2:数据分析中的去重与合并
在分析用户行为日志时,需合并两个不同来源的日志文件,去除重复记录:
log1 = ["user1:login", "user2:view", "user3:purchase"]
log2 = ["user2:view", "user4:logout", "user5:search"]
unique_logs = list(set(log1) | set(log2))
print(unique_logs) # 输出包含所有唯一日志条目
扩展知识:集合的其他操作
交集(Intersection)
计算两个集合共有的元素:
set_a = {1, 2, 3}
set_b = {3, 4, 5}
intersection = set_a & set_b # 或 set_a.intersection(set_b)
print(intersection) # 输出:{3}
差集(Difference)
找出属于集合 A 但不属于集合 B 的元素:
difference = set_a - set_b # 或 set_a.difference(set_b)
print(difference) # 输出:{1, 2}
对称差集(Symmetric Difference)
返回两个集合中独有的元素:
symmetric_diff = set_a ^ set_b # 或 set_a.symmetric_difference(set_b)
print(symmetric_diff) # 输出:{1, 2, 4, 5}
总结与建议
通过本文的讲解,读者应能掌握以下核心要点:
- 集合的特性:无序、不可重复、高效操作;
- 并集的实现方法:使用
|
运算符或union()
方法; - 性能优化:在处理大规模数据时,优先选择集合而非列表;
- 实际应用:合并库存、去重日志等场景的解决方案。
对于中级开发者,建议进一步探索集合的其他操作(如交集、差集)及其在算法中的应用。对于初学者,可通过练习不同案例巩固集合的使用方法,并理解其与列表的本质区别。
掌握集合操作不仅能提升代码效率,还能帮助开发者更灵活地处理数据问题。希望本文能成为你 Python 学习路上的实用指南!