Python collections 模块
标准库 collections 提供多种专用容器,在 字典、列表、元组 等基础类型之上,补充了更便捷或更高效的数据结构。
注意:中文「集合」有时指 set 类型;本篇标题里的 Collections 指模块名 collections,不要与 set 混为一谈。
使用前需导入,例如:
from collections import OrderedDict, defaultdict, Counter, namedtuple, deque, ChainMapOrderedDict:有序字典
OrderedDict 会记住键的插入顺序。自 Python 3.7 起,普通 dict 也保证插入顺序,因此许多场景直接用 dict 即可。OrderedDict 仍有用武之地,例如 move_to_end()、popitem(last=True/False) 等额外 API。
from collections import OrderedDict
od = OrderedDict()
od["a"] = 1
od["b"] = 2
od["a"] = 10 # 覆盖已有键,顺序不变(键仍在原位置)
print(list(od.items()))输出:
[('a', 10), ('b', 2)]defaultdict:带默认值的字典
普通 dict 访问不存在的键会 KeyError。defaultdict(factory) 在键缺失时调用 factory() 生成默认值(如 list、int),适合按键分组。
from collections import defaultdict
dd = defaultdict(list)
dd["key"].append(1)
dd["key"].append(2)
print(dict(dd))输出:
{'key': [1, 2]}from collections import defaultdict
dd = defaultdict(int)
for ch in "hello":
dd[ch] += 1
print(dict(dd))输出:
{'h': 1, 'e': 1, 'l': 2, 'o': 1}Counter:计数器
Counter 是 dict 的子类,用于统计可哈希对象出现次数;常用 most_common()。
from collections import Counter
c = Counter("abracadabra")
print(c)
print(c.most_common(3))输出(计数顺序可能因实现略有差异,键值一致):
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
[('a', 5), ('b', 2), ('r', 2)]namedtuple:带字段名的元组
namedtuple 生成元组子类,元素既可按索引访问,也可按属性名访问,且实例不可变(与元组一致)。
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(11, 22)
print(p.x, p.y, p[0])输出:
11 22 11复杂数据模型可逐步改用 dataclasses(标准库);namedtuple 仍适合轻量、不可变记录。
deque:双端队列
deque(double-ended queue)在两端添加、弹出均为近似 O(1),适合滑动窗口、广度优先等;中间插入效率不如 list。
from collections import deque
d = deque([1, 2, 3])
d.append(4)
d.appendleft(0)
print(d)
print(d.pop(), d.popleft())
print(d)输出:
deque([0, 1, 2, 3, 4])
4 0
deque([1, 2, 3])ChainMap:多字典链式查找
ChainMap 把多个映射串成一条查找链:从前到后找第一个存在的键,不合并成新字典,而是视图。
from collections import ChainMap
x = {1: "Engineering", 2: "Medical"}
y = {3: "Analytics", 4: "Python"}
z = ChainMap(x, y)
print(z[1], z[3])
print(list(z.keys()))输出:
Engineering Analytics
[1, 2, 3, 4]若多个子映射有相同键,返回最前面映射中的值。
小结
| 类型 | 用途概要 |
|---|---|
OrderedDict | 有序字典 + 重排/弹出端点等扩展 |
defaultdict | 缺键时自动生成默认值,常做分组 |
Counter | 频次统计、most_common |
namedtuple | 命名字段的不可变元组 |
deque | 双端高效增删 |
ChainMap | 多层字典按顺序查找 |
模块中还有 UserDict / UserList / UserString 等,便于自定义容器时继承,需要时再查文档。