📚 Python 集合(Set)全面学习指南
集合(Set)是 Python 中用于存储唯一元素 且无序的数据结构,支持高效的成员检测和集合运算(交集、并集等)。系统性知识整理,涵盖基础操作、高级技巧和实际应用。
一、集合基础
1. 创建集合
python
# 创建空集合(必须使用 set(),{} 创建的是空字典)
empty_set = set()
# 直接定义集合
numbers = {1, 2, 3, 4, 5}
letters = set("hello") # {'h', 'e', 'l', 'o'}
# 从列表去重生成集合
data = [2, 3, 2, 5, 3]
unique_data = set(data) # {2, 3, 5}
二、集合操作与方法
1. 增删元素
方法 | 功能 | 示例 |
---|---|---|
add(x) |
添加单个元素 | numbers.add(6) → {1,2,3,4,5,6} |
update(iter) |
合并可迭代对象的元素 | numbers.update([7,8]) |
remove(x) |
删除元素(不存在时报错) | numbers.remove(3) |
discard(x) |
安全删除元素(不报错) | numbers.discard(10) |
pop() |
随机删除并返回一个元素 | element = numbers.pop() |
clear() |
清空集合 | numbers.clear() |
2. 集合运算
操作 | 符号 | 方法 | 示例 |
---|---|---|---|
并集 (Union) | ` | ` | union() |
交集 (Intersection) | & |
intersection() |
a & b 或 a.intersection(b) |
差集 (Difference) | - |
difference() |
a - b 或 a.difference(b) |
对称差集 (Symmetric) | ^ |
symmetric_difference() |
a ^ b 或 a.symmetric_difference(b) |
python
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # {1, 2, 3, 4, 5}
print(a & b) # {3}
print(a - b) # {1, 2}
print(a ^ b) # {1, 2, 4, 5}
3. 关系判断
方法 | 功能 | 示例 |
---|---|---|
issubset() |
判断是否为子集 | a.issubset(b) |
issuperset() |
判断是否为超集 | a.issuperset(b) |
isdisjoint() |
判断是否无交集 | a.isdisjoint(b) |
python
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b)) # True
print(b.issuperset(a)) # True
三、高级特性与技巧
1. 集合推导式
python
# 生成唯一平方数集合
squares = {x**2 for x in [1, -1, 2, -2, 3]} # {1, 4, 9}
# 过滤偶数
numbers = {1, 2, 3, 4, 5}
even = {x for x in numbers if x % 2 == 0} # {2, 4}
2. 不可变集合 frozenset
python
# 创建不可变集合
fs = frozenset([1, 2, 3])
# 作为字典的键或集合的元素
valid_keys = {fs: "value"}
nested_set = {fs, frozenset([4, 5])}
3. 性能优势
- 成员检测
x in set
: O(1) 时间复杂度
(列表为 O(n)) - 去重效率:集合比遍历列表检测重复更快。
python
# 列表 vs 集合成员检测速度对比
from timeit import timeit
list_time = timeit("1000000 in lst", setup="lst = list(range(1000000))", number=100)
set_time = timeit("1000000 in s", setup="s = set(range(1000000))", number=100)
print(f"列表检测时间: {list_time:.6f}s")
print(f"集合检测时间: {set_time:.6f}s")
四、实际应用案例
1. 数据去重
python
# 快速去重并保留顺序
def deduplicate_ordered(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
data = [2, 3, 2, 5, 3]
print(deduplicate_ordered(data)) # [2, 3, 5]
2. 共同兴趣发现
python
# 找出多个用户的共同兴趣
user1 = {"音乐", "电影", "读书"}
user2 = {"读书", "旅行", "美食"}
user3 = {"电影", "读书", "游戏"}
common_interests = user1 & user2 & user3
print(common_interests) # {'读书'}
3. 权限管理系统
python
# 检查用户权限
required_permissions = {"read", "write"}
user_permissions = {"read", "execute"}
if required_permissions.issubset(user_permissions):
print("权限足够")
else:
missing = required_permissions - user_permissions
print(f"缺少权限: {missing}") # 输出: 缺少权限: {'write'}
五、常见问题与误区
1. 空集合的创建
- 错误用法 :
empty_set = {}
→ 创建的是空字典 - 正确用法 :
empty_set = set()
2. 集合中元素的类型限制
-
集合只能包含不可变(hashable)类型(如数字、字符串、元组)。
-
非法操作 :
pythoninvalid_set = {[1, 2], 3} # 报错:列表是可变类型
3. 集合无序性带来的问题
python
s = {3, 1, 2}
print(s) # 输出顺序不确定(如 {1, 2, 3} 或 {3, 1, 2})
六、总结
场景 | 推荐数据结构 | 原因 |
---|---|---|
需要唯一元素 | 集合 (set ) |
自动去重,高效成员检测 |
保持插入顺序 | 列表 (list ) |
集合是无序的 |
键值对存储 | 字典 (dict ) |
集合不存储键值对 |
掌握集合的用法后,可显著优化需要去重或集合运算的代码逻辑!