collections 是 Python 标准库中一个非常重要的模块,它提供了许多有用的容器数据类型,作为内置容器(如 list, dict, set, tuple)的替代或增强。这些专用容器数据类型可以解决各种特定的编程问题。
1. 主要容器类型 #
1.1 namedtuple() - 命名元组工厂函数 #
创建具有命名字段的元组子类,使代码更易读。
from collections import namedtuple
# 创建一个名为'Point'的命名元组,具有x和y字段
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p.x, p.y) # 11 22
print(p[0] + p[1]) # 33特点:
- 内存效率高(与普通元组相同)
- 可以通过属性名或索引访问字段
- 不可变(immutable)
应用场景:
- 替代只有属性的简单类
- 数据库记录
- CSV/JSON数据处理
1.2 deque - 双端队列 #
线程安全、快速从两端添加或删除元素。
from collections import deque
d = deque('ghi')
d.append('j') # 右端添加
d.appendleft('f') # 左端添加
d.pop() # 右端删除
d.popleft() # 左端删除特点:
- 从两端操作的复杂度为O(1)
- 支持最大长度限制
- 支持旋转操作(
rotate())
应用场景:
- 实现队列和栈
- 滑动窗口算法
- 最近使用项缓存
1.3 ChainMap - 链式映射 #
将多个字典或映射链接在一起,形成一个单一视图。
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'b': 4}
chain = ChainMap(dict1, dict2)
print(chain['a']) # 1 (来自dict1)
print(chain['b']) # 2 (来自dict1,优先)
print(chain['c']) # 3 (来自dict2)特点:
- 查找按顺序检查所有映射
- 写操作只影响第一个映射
- 不合并数据,保持原始映射
应用场景:
- 多层配置管理
- 模拟作用域(如变量查找)
- 命令行参数优先级处理
1.4 Counter - 计数器 #
用于计数可哈希对象的字典子类。
from collections import Counter
cnt = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
print(cnt) # Counter({'blue': 3, 'red': 2, 'green': 1})
# 常用操作
print(cnt.most_common(1)) # [('blue', 3)]
cnt.update(['red', 'yellow']) # 更新计数特点:
- 元素存储为字典键,计数存储为字典值
- 支持算术运算(+, -, &, |)
- 提供多种统计方法
应用场景:
- 词频统计
- 数据分布分析
- 购物车商品计数
1.5 OrderedDict - 有序字典 #
记住元素插入顺序的字典。
from collections import OrderedDict
d = OrderedDict()
d['first'] = 1
d['second'] = 2
d['third'] = 3
print(list(d.keys())) # ['first', 'second', 'third']
# 保持插入顺序,即使键被更新
d['first'] = 100
print(list(d.keys())) # ['first', 'second', 'third']特点:
- Python 3.7+ 中普通dict也保持顺序,但OrderedDict有额外方法
- 支持反向迭代(
reversed()) - 支持顺序敏感的比较操作
应用场景:
- 需要保持插入顺序的场景
- 实现LRU缓存
- 配置项的顺序保存
1.6 defaultdict - 默认字典 #
在键不存在时自动创建默认值的字典。
from collections import defaultdict
dd = defaultdict(list) # 默认值为空列表
dd['colors'].append('red')
dd['colors'].append('blue')
print(dd) # defaultdict(<class 'list'>, {'colors': ['red', 'blue']})特点:
- 必须提供默认值工厂函数
- 键不存在时自动调用工厂函数
- 减少键存在性检查代码
应用场景:
- 分组和分类数据
- 构建多值字典
- 树状数据结构
2. 其他有用工具 #
2.1 UserDict, UserList, UserString #
这些是包装类,便于创建自定义的字典、列表或字符串类。
from collections import UserDict
class MyDict(UserDict):
def __missing__(self, key):
return 'default'2.2 abc 模块中的抽象基类 #
虽然不在collections中,但与之相关:
ContainerIterableSizedMappingSequence
3. 使用建议 #
性能考虑:
deque适合频繁的两端操作defaultdict可以减少键检查开销Counter比手动计数更高效
代码可读性:
namedtuple使代码更自文档化ChainMap明确表达多层查找意图
功能扩展:
- 继承这些专用容器可以方便地创建自定义数据结构
collections 模块的这些工具可以显著简化许多常见编程任务,使代码更简洁、更高效,同时提高可读性。