Python3 集合详解

在 Python 3 中,集合(set)是一种无序且元素唯一的数据结构,它基于哈希表实现,提供了高效的成员检测、去重以及数学集合运算等功能。本文将深入解析 Python 3 集合的核心特性、常用操作及应用场景。

一、集合的基本特性与创建

集合的核心特性包括:

  • 元素唯一性:自动去重
  • 无序性:不支持索引访问
  • 元素必须可哈希:不可变类型(如整数、字符串、元组)可作为元素

创建集合的方式有两种:
 
# 使用花括号创建集合(注意:空集合需用set())
fruits = {'apple', 'banana', 'cherry'}

# 使用set()构造函数
numbers = set([1, 2, 3, 2, 1])  # 自动去重,结果为{1, 2, 3}

# 创建空集合
empty_set = set()  # 不能用{},因为{}创建的是空字典
 

二、集合的常用操作

1. 成员检测

fruits = {'apple', 'banana', 'cherry'}
print('apple' in fruits)  # 输出: True
print('mango' not in fruits)  # 输出: True
 

2. 添加元素

s = {1, 2, 3}
s.add(4)  # 添加单个元素,结果:{1, 2, 3, 4}
s.update([4, 5, 6])  # 添加多个元素,结果:{1, 2, 3, 4, 5, 6}
 

3. 删除元素

s = {1, 2, 3, 4}
s.remove(3)  # 删除指定元素,不存在则报错
s.discard(5)  # 删除指定元素,不存在不报错
s.pop()  # 随机删除并返回一个元素
s.clear()  # 清空集合
 

4. 集合运算

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# 交集
print(a & b)  # 输出: {3, 4}
print(a.intersection(b))  # 等价方法

# 并集
print(a | b)  # 输出: {1, 2, 3, 4, 5, 6}
print(a.union(b))  # 等价方法

# 差集
print(a - b)  # 输出: {1, 2}
print(a.difference(b))  # 等价方法

# 对称差集(异或)
print(a ^ b)  # 输出: {1, 2, 5, 6}
print(a.symmetric_difference(b))  # 等价方法
 

三、集合的高级特性

1. 不可变集合(frozenset)

fs = frozenset([1, 2, 3])
# fs.add(4)  # 报错,frozenset不可变
# 可作为字典的键或其他集合的元素
d = {fs: 'frozenset_example'}
 

2. 集合推导式

s = {x**2 for x in range(5)}  # 结果:{0, 1, 4, 9, 16}
 

3. 集合操作的原地版本

a = {1, 2, 3}
b = {3, 4, 5}
a.update(b)  # 原地并集,a变为{1, 2, 3, 4, 5}
a.intersection_update(b)  # 原地交集,a变为{3}
 

四、集合的性能分析

集合基于哈希表实现,常见操作的时间复杂度为:

  • 成员检测(in):O (1)
  • 添加元素(add):O (1)
  • 删除元素(remove):O (1)
  • 交集、并集、差集:O (n)

对比列表的成员检测 O (n),集合在大规模数据去重和快速查找场景中性能优势明显。

五、应用场景

1. 数据去重

lst = [1, 2, 2, 3, 3, 3]
unique_lst = list(set(lst))  # 结果:[1, 2, 3]
 

2. 交集查找

users_in_group1 = {'Alice', 'Bob', 'Charlie'}
users_in_group2 = {'Bob', 'David', 'Eve'}
common_users = users_in_group1 & users_in_group2  # 结果:{'Bob'}
 

3. 快速存在性检查

# 检查大量URL是否已访问
visited_urls = set()
if url not in visited_urls:
    # 处理新URL
    visited_urls.add(url)
 

4. 数学集合问题

# 计算两个列表的对称差(仅在A或仅在B中的元素)
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
sym_diff = list(set(a) ^ set(b))  # 结果:[1, 2, 5, 6]

六、注意事项

  1. 集合元素必须可哈希,因此列表、字典等可变类型不能作为集合元素
  2. 集合本身是无序的,若需要有序集合,可使用OrderedDictlist配合set去重
  3. 集合操作会生成新集合,若需原地修改,使用update()等原地方法
  4. 集合的哈希表实现使其在内存占用上通常高于列表

posted on 2025-06-24 14:02  小陶coding  阅读(55)  评论(0)    收藏  举报