常用数据结构之集合
常用数据结构之集合(Set)
在编程世界中,集合(Set)是一种常见的且强大的数据结构。在 Python 中,集合被用来处理一组无序、不重复的元素,背后依赖哈希(Hashing)机制,使得集合在成员查找和集合运算上拥有极高性能。
一、什么是集合?
集合是 Python 中的一种内置数据结构,代表一组唯一且无序的元素,类似数学中的集合概念。
特性总结:
特性 | 描述 |
---|---|
无序性 | 元素没有固定顺序,不能通过索引访问 |
互异性 | 元素不能重复,重复项会自动去重 |
确定性 | 一个元素要么在集合中,要么不在 |
二、集合的使用场景
1. 去重
names = ['Alice', 'Bob', 'Alice', 'Tom']
unique_names = set(names)
用集合快速剔除重复项。
2. 快速查找
blacklist = {'root', 'admin', 'test'}
if username in blacklist:
print("禁止登录")
集合查找远快于列表,适合构建黑名单、白名单系统。
3. 集合运算
set1 = {'Python', 'Java', 'C++'}
set2 = {'Python', 'Go', 'Rust'}
print(set1 & set2) # {'Python'}
高效求交集、并集、差集,适合数据比对、关键词筛选等场景。
三、集合的创建方式
# 字面量方式({})
set1 = {1, 2, 3}
# set 函数
set2 = set('hello') # 自动去重:{'h', 'e', 'l', 'o'}
# 从列表转换
set3 = set([1, 2, 2, 3])
# 推导式创建
set4 = {x for x in range(10) if x % 2 == 0}
注意:空集合必须写作
set()
,而不是{}
,后者是空字典。
四、集合的元素类型要求
集合中的元素必须是可哈希(hashable)类型,这通常意味着:
- ✅ 支持:
int
,float
,str
,tuple
,frozenset
- ❌ 不支持:
list
,set
,dict
原因:哈希值必须稳定,以支持集合底层哈希查找结构。
五、集合的遍历方法
langs = {'Python', 'Java', 'Go'}
for lang in langs:
print(lang)
不能使用索引访问集合! 需要用
for-in
遍历。
六、集合运算详解
1. 成员运算
'x' in {'x', 'y', 'z'} # True
'abc' not in set(['a']) # True
2. 交集(&)
a & b # 或 a.intersection(b)
3. 并集(|)
a | b # 或 a.union(b)
4. 差集(-)
a - b # a 中有但 b 中没有
5. 对称差集(^)
a ^ b # a 或 b 中存在但不同时存在
示例:
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b) # {2, 3}
print(a | b) # {1, 2, 3, 4}
print(a - b) # {1}
print(a ^ b) # {1, 4}
七、集合的比较运算
操作符与关系
运算符 | 含义 |
---|---|
== / != |
判断集合内容是否完全相等 |
< / <= |
判断是否是子集 |
> / >= |
判断是否是超集 |
示例:
a = {1, 2}
b = {1, 2, 3}
print(a < b) # True (真子集)
print(a.issubset(b)) # True
print(b.issuperset(a)) # True
八、集合的方法一览
方法 | 功能 |
---|---|
add(elem) |
添加元素 |
remove(elem) |
删除元素(若不存在则抛异常) |
discard(elem) |
删除元素(若不存在不会抛异常) |
pop() |
随机删除一个元素并返回 |
clear() |
清空集合 |
update(iterable) |
将其它集合并入 |
intersection_update(iterable) |
取交集并更新 |
difference_update(iterable) |
取差集并更新 |
isdisjoint(other) |
是否没有交集 |
九、不可变集合:frozenset
fs1 = frozenset([1, 2, 3])
fs2 = frozenset([2, 3, 4])
print(fs1 | fs2) # frozenset({1, 2, 3, 4})
用途:
- 可作为字典的键
- 可作为集合中的元素
- 安全传递不可变集合,避免被误修改
十、集合的最佳实践与建议
✅ 使用集合的场景:
- 大数据去重、快速判断成员是否存在
- 处理标签、关键词、用户ID、IP地址等集合类数据
- 需要频繁执行交集、并集等集合运算的业务逻辑
❌ 不适合使用集合的情况:
- 需要保留元素顺序(应使用
list
或collections.OrderedDict
) - 元素需要频繁变更内部结构(避免使用
list
作为元素)
⚠️ 性能提示:
- 使用
in
查找时,集合远快于列表,尤其在元素数量庞大时更显著。
总结回顾
特性 | 描述 |
---|---|
类型 | set (可变) vs frozenset (不可变) |
特征 | 无序、互异、快速查找 |
运算 | 并集、交集、差集、对称差、子集/超集判断 |
使用建议 | 适用于唯一性要求强、数据去重、关键词比较场景 |
通过本章节的学习,你已经掌握了 Python 集合的核心概念、操作方法和典型应用场景。集合是编程中不可或缺的工具之一,掌握它,能帮助你更高效地处理数据集合类问题。下一节我们将进入字典(dict)的世界,它是键值对数据的容器,同样在实际开发中用途极广。敬请期待!