Skip to content

Python collections 模块

标准库 collections 提供多种专用容器,在 字典列表元组 等基础类型之上,补充了更便捷或更高效的数据结构。

注意:中文「集合」有时指 set 类型;本篇标题里的 Collections模块名 collections,不要与 set 混为一谈。

使用前需导入,例如:

python
from collections import OrderedDict, defaultdict, Counter, namedtuple, deque, ChainMap

OrderedDict:有序字典

OrderedDict 会记住键的插入顺序。自 Python 3.7 起,普通 dict保证插入顺序,因此许多场景直接用 dict 即可。OrderedDict 仍有用武之地,例如 move_to_end()popitem(last=True/False) 等额外 API。

python
from collections import OrderedDict

od = OrderedDict()
od["a"] = 1
od["b"] = 2
od["a"] = 10  # 覆盖已有键,顺序不变(键仍在原位置)

print(list(od.items()))

输出:

text
[('a', 10), ('b', 2)]

defaultdict:带默认值的字典

普通 dict 访问不存在的键会 KeyErrordefaultdict(factory) 在键缺失时调用 factory() 生成默认值(如 listint),适合按键分组

python
from collections import defaultdict

dd = defaultdict(list)
dd["key"].append(1)
dd["key"].append(2)
print(dict(dd))

输出:

text
{'key': [1, 2]}
python
from collections import defaultdict

dd = defaultdict(int)
for ch in "hello":
    dd[ch] += 1
print(dict(dd))

输出:

text
{'h': 1, 'e': 1, 'l': 2, 'o': 1}

Counter:计数器

Counterdict 的子类,用于统计可哈希对象出现次数;常用 most_common()

python
from collections import Counter

c = Counter("abracadabra")
print(c)
print(c.most_common(3))

输出(计数顺序可能因实现略有差异,键值一致):

text
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
[('a', 5), ('b', 2), ('r', 2)]

namedtuple:带字段名的元组

namedtuple 生成元组子类,元素既可按索引访问,也可按属性名访问,且实例不可变(与元组一致)。

python
from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p = Point(11, 22)
print(p.x, p.y, p[0])

输出:

text
11 22 11

复杂数据模型可逐步改用 dataclasses(标准库);namedtuple 仍适合轻量、不可变记录。

deque:双端队列

deque(double-ended queue)在两端添加、弹出均为近似 O(1),适合滑动窗口广度优先等;中间插入效率不如 list

python
from collections import deque

d = deque([1, 2, 3])
d.append(4)
d.appendleft(0)
print(d)
print(d.pop(), d.popleft())
print(d)

输出:

text
deque([0, 1, 2, 3, 4])
4 0
deque([1, 2, 3])

ChainMap:多字典链式查找

ChainMap 把多个映射串成一条查找链:从前到后找第一个存在的键,不合并成新字典,而是视图

python
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()))

输出:

text
Engineering Analytics
[1, 2, 3, 4]

若多个子映射有相同键,返回最前面映射中的值。

小结

类型用途概要
OrderedDict有序字典 + 重排/弹出端点等扩展
defaultdict缺键时自动生成默认值,常做分组
Counter频次统计、most_common
namedtuple命名字段的不可变元组
deque双端高效增删
ChainMap多层字典按顺序查找

模块中还有 UserDict / UserList / UserString 等,便于自定义容器时继承,需要时再查文档。

参考