常用数据结构之集合
基础教学 1 min read

常用数据结构之集合

Blog Author

常用数据结构之集合(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地址等集合类数据
  • 需要频繁执行交集、并集等集合运算的业务逻辑

❌ 不适合使用集合的情况:

  • 需要保留元素顺序(应使用 listcollections.OrderedDict
  • 元素需要频繁变更内部结构(避免使用 list 作为元素)

⚠️ 性能提示:

  • 使用 in 查找时,集合远快于列表,尤其在元素数量庞大时更显著。

总结回顾

特性 描述
类型 set(可变) vs frozenset(不可变)
特征 无序、互异、快速查找
运算 并集、交集、差集、对称差、子集/超集判断
使用建议 适用于唯一性要求强、数据去重、关键词比较场景

通过本章节的学习,你已经掌握了 Python 集合的核心概念、操作方法和典型应用场景。集合是编程中不可或缺的工具之一,掌握它,能帮助你更高效地处理数据集合类问题。下一节我们将进入字典(dict)的世界,它是键值对数据的容器,同样在实际开发中用途极广。敬请期待!