Python 中常用的数据结构及其底层实现、应用场景如下:
1. 列表(List)
- 底层实现:动态数组(Dynamic Array)
内存中分配连续空间,当空间不足时自动扩容(通常按约 1.125 倍 扩展)。 - 特点:有序、可变、允许重复元素。
- 时间复杂度:
- 索引访问:
O(1) - 尾部追加/删除:
O(1)(均摊) - 头部/中间插入/删除:
O(n)
- 索引访问:
- 应用场景:
- 存储有序集合(如用户购物车、日志记录)。
- 需要频繁修改尾部数据(如栈操作)。
- 不适合在头部频繁插入/删除(改用
collections.deque)。
2. 元组(Tuple)
- 底层实现:静态数组(Static Array)
内存中分配连续空间,创建后不可修改。 - 特点:有序、不可变、允许重复元素。
- 时间复杂度:索引访问
O(1)。 - 应用场景:
- 存储不可变数据(如坐标
(x, y)、数据库查询结果)。 - 作为字典的键(因不可变性可哈希)。
- 函数返回多个值(如
return (status, data))。
- 存储不可变数据(如坐标
3. 字典(Dict)
- 底层实现:哈希表(Hash Table)
通过哈希函数将键映射到桶(bucket),使用开放寻址法解决冲突(CPython 实现)。 - 特点:键值对、键唯一、无序(Python 3.7+ 保留插入顺序)。
- 时间复杂度:
- 插入/查找/删除:平均
O(1),最坏O(n)(哈希冲突严重时)。
- 插入/查找/删除:平均
- 应用场景:
- 快速键值查找(如缓存、数据库索引)。
- 存储对象属性(如
{"name": "Alice", "age": 30})。 - 数据分组统计(如按类别聚合数据)。
4. 集合(Set)
- 底层实现:哈希表(Hash Table)
类似字典,但仅存储键(无值)。 - 特点:无序、元素唯一、不可索引。
- 时间复杂度:
- 插入/查找/删除:平均
O(1),最坏O(n)。
- 插入/查找/删除:平均
- 应用场景:
- 去重(如
unique_words = set(word_list))。 - 成员关系测试(如检查用户ID是否存在)。
- 集合运算(交集、并集:
set1 & set2、set1 | set2)。
- 去重(如
5. 双端队列(collections.deque)
- 底层实现:双向链表(Doubly Linked List)
由多个块(block)组成的链表,支持高效两端操作。 - 特点:线程安全、两端操作高效。
- 时间复杂度:
- 头部/尾部插入/删除:
O(1)。 - 中间访问:
O(n)。
- 头部/尾部插入/删除:
- 应用场景:
- 队列/栈(如 BFS 算法、任务调度)。
- 需要频繁在两端增删数据(如实时数据流处理)。
- 替代列表在头部操作频繁的场景(如
deque.popleft())。
6. 堆(heapq)
- 底层实现:二叉堆(Binary Heap)
用列表存储的完全二叉树,满足堆属性(父节点值 ≤ 子节点值)。 - 特点:最小堆(根节点最小)、部分有序。
- 时间复杂度:
- 插入元素:
O(log n) - 弹出最小值:
O(log n)
- 插入元素:
- 应用场景:
- 优先队列(如任务按优先级执行)。
- Top-K 问题(如
heapq.nlargest(10, data))。 - 合并有序序列(如堆排序)。
7. 字符串(String)
- 底层实现:不可变字符数组
存储 Unicode 字符序列(Python 3+)。 - 特点:不可变、支持切片/正则。
- 时间复杂度:
- 索引访问:
O(1) - 拼接:
O(n)(需创建新对象)。
- 索引访问:
- 应用场景:
- 文本处理(如解析 CSV/JSON)。
- 正则表达式匹配。
- 避免频繁拼接(改用
str.join()或io.StringIO)。
8. 其他高级结构
| 数据结构 | 模块/类 | 应用场景 |
|---|---|---|
| 命名元组 | collections.namedtuple | 创建类元组的对象(如 Point = namedtuple('Point', ['x', 'y'])) |
| 计数器 | collections.Counter | 统计元素频率(如 Counter("hello") → {'l':2, 'h':1}) |
| 默认字典 | collections.defaultdict | 自动初始化缺失键(如 dd = defaultdict(list)) |
| 有序字典 | collections.OrderedDict | 保留插入顺序(Python 3.7+ 后 dict 默认有序) |
| 链式映射 | collections.ChainMap | 合并多个字典(如配置优先级:config = ChainMap(user_conf, default_conf)) |
选择建议
- 快速查找键 → 字典或集合(哈希表)。
- 有序数据 + 尾部操作 → 列表(动态数组)。
- 频繁头部操作 →
deque(双向链表)。 - 不可变数据 → 元组或字符串。
- 优先级处理 → 堆(
heapq)。 - 去重统计 → 集合或
Counter。
掌握底层实现有助于优化性能(如避免在列表头部插入,改用 deque),合理选择数据结构可显著提升代码效率。
409

被折叠的 条评论
为什么被折叠?



