在集合(set)类型中,| 表示并集操作,返回包含两个集合所有元素的新集合(自动去重)。这是|最直观、最安全的用法之一,广泛应用于数据清洗、特征工程等场景。
基本语法与示例
# 创建两个集合
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 并集操作
union = set_a | set_b
print(union) # {1, 2, 3, 4, 5, 6}
# 原集合不变
print(set_a) # {1, 2, 3, 4}
print(set_b) # {3, 4, 5, 6}
与list的对比:为什么集合更高效?
若用列表模拟并集,需手动去重:
# 列表实现并集(低效)
list_a = [1, 2, 3, 4]
list_b = [3, 4, 5, 6]
# 方法1:转换为set再转回list(推荐)
result = list(set(list_a + list_b)) # [1, 2, 3, 4, 5, 6]
# 方法2:手动去重(冗余)
result = list_a.copy()
for item in list_b:
if item not in result:
result.append(item)
⏱️
性能对比
对10,000个元素的列表:
- list + set:~1.2ms
- set | set:~0.3ms
- 手动去重:~8.7ms
?
底层原理
集合基于哈希表实现,插入/查找O(1);列表需遍历检查O(n),效率差异显著。
实战场景:爬虫数据合并
在爬虫开发中,常需合并多个页面的用户ID列表:
def merge_user_ids(pages):
"""合并多页用户ID,去重"""
return set() | pages[0] if pages else set()
# 示例:爬取3页用户数据
page1 = {1001, 1002, 1003, 1004}
page2 = {1003, 1005, 1006}
page3 = {1002, 1007, 1008}
all_users = page1 | page2 | page3
# {1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008}
# 统计独立用户数
print(f"独立用户数: {len(all_users)}")
进阶:多集合并集与可变参数
使用reduce合并动态数量的集合:
from functools import reduce
# 动态合并多个集合
pages = [
{1, 2, 3},
{3, 4, 5},
{5, 6, 7},
{7, 8, 9}
]
# 方法1:循环
all_ids = set()
for page in pages:
all_ids |= page # 原地并集
# 方法2:reduce + lambda
all_ids = reduce(lambda x, y: x | y, pages)
print(all_ids) # {1, 2, 3, 4, 5, 6, 7, 8, 9}
最佳实践:优先使用|=实现原地并集,减少内存分配;对少量集合,直接用|更清晰。