Python 使用集合找出两个列表的并集(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 Python 编程中,处理数据集合的交集、并集和差集是常见的操作需求。例如,电商系统可能需要合并两个仓库的商品清单,或者数据分析时需要整合两组实验数据。本文将聚焦于“Python 使用集合找出两个列表的并集”这一主题,通过循序渐进的讲解,帮助读者掌握集合的特性、并集的实现方法,以及如何在实际场景中高效应用这一技术。


集合的基本概念与特性

什么是集合?

集合(Set)是 Python 中一种无序、可变(但元素不可变)且不包含重复元素的数据结构。它类似于数学中的集合概念,支持高效的成员检测、交集、并集和差集等操作。与列表(List)相比,集合的主要优势在于:

  1. 无序性:元素不按特定顺序存储;
  2. 唯一性:自动去重,无法存储重复值;
  3. 高效性:成员检测、交并差运算的时间复杂度为 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]  

关键点总结

  1. 优先使用集合操作:集合的 union()| 运算符是并集操作的首选方案,因其时间复杂度更低;
  2. 结果无序性:集合的并集结果不保证元素顺序,若需保留顺序,需结合列表操作;
  3. 元素类型限制:集合中的元素必须是不可变类型(如整数、字符串、元组),不能包含列表等可变类型。

列表与集合的性能对比

实际案例:合并两个大型列表

假设需要合并两个包含百万级元素的列表,比较不同方法的性能差异:

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}  

总结与建议

通过本文的讲解,读者应能掌握以下核心要点:

  1. 集合的特性:无序、不可重复、高效操作;
  2. 并集的实现方法:使用 | 运算符或 union() 方法;
  3. 性能优化:在处理大规模数据时,优先选择集合而非列表;
  4. 实际应用:合并库存、去重日志等场景的解决方案。

对于中级开发者,建议进一步探索集合的其他操作(如交集、差集)及其在算法中的应用。对于初学者,可通过练习不同案例巩固集合的使用方法,并理解其与列表的本质区别。

掌握集合操作不仅能提升代码效率,还能帮助开发者更灵活地处理数据问题。希望本文能成为你 Python 学习路上的实用指南!

最新发布