Python中collections模块的深度解析
Python collections 模块详解
collections 是 Python 标准库中提供高效数据结构的模块,扩展了内置数据类型(如 list、dict、tuple),适用于处理复杂数据场景。以下是其核心内容及常用函数:
核心数据结构与功能
1. namedtuple(命名元组)
python
from collections import namedtuple
# 定义命名元组类型(类名,字段列表)
Point = namedtuple("Point", ["x", "y"])
python
p = Point(10, y=20)
print(p.x) # 10
print(p[0]) # 10(仍支持索引访问)
print(p._asdict()) # {'x': 10, 'y': 20}(转为字典)
2. deque(双端队列)
用途:高效实现队列(FIFO)或栈(LIFO),支持快速头尾插入/删除。
核心方法:
| 方法 | 描述 |
|---|---|
append(x) |
右端添加元素 |
appendleft(x) |
左端添加元素 |
pop() |
移除并返回右端元素 |
popleft() |
移除并返回左端元素 |
extend(iterable) |
右端扩展多个元素 |
extendleft(iterable) |
左端扩展多个元素(逆序添加) |
rotate(n) |
循环右移 n 步(负数为左移) |
示例:
python
from collections import deque
dq = deque([1, 2, 3])
dq.appendleft(0) # deque([0, 1, 2, 3])
dq.rotate(1) # deque([3, 0, 1, 2])
3. Counter(计数器)
用途:统计可哈希对象(如字符串、列表)的元素频率。
核心方法:
| 方法 | 描述 |
|---|---|
elements() |
返回元素迭代器(按计数重复) |
most_common(n) |
返回频率最高的前 n 个元素 |
update(iterable) |
合并其他元素的计数 |
示例:
python
from collections import Counter
cnt = Counter("abracadabra")
print(cnt) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(cnt.most_common(2)) # [('a', 5), ('b', 2)]
cnt.update(["a", "x"]) # 计数更新为 a:6, x:1
4. defaultdict(默认字典)
python
from collections import defaultdict
# 指定默认值类型(如 int、list、lambda 表达式)
d = defaultdict(int) # 缺失键默认值为 0
python
words = ["apple", "banana", "apple"]
count = defaultdict(int)
for word in words:
count[word] += 1 # 无需检查键是否存在
print(count) # {'apple': 2, 'banana': 1}
5. OrderedDict(有序字典)
用途:保持键的插入顺序(Python 3.7+ 普通 dict 已支持,但此类提供额外方法)。
特有方法:
| 方法 | 描述 |
|---|---|
move_to_end(key) |
将键移动到字典末尾或开头 |
popitem(last=True) |
移除最后/最先插入的键值对 |
示例:
python
from collections import OrderedDict
od = OrderedDict()
od["a"] = 1
od["b"] = 2
od.move_to_end("a") # OrderedDict([('b', 2), ('a', 1)])
6. ChainMap(链式映射)
用途:将多个字典合并为单一逻辑视图,按顺序查找键。
核心方法:
| 方法 | 描述 |
|---|---|
new_child(m) |
添加新字典到链首 |
parents |
返回除第一个外的所有字典 |
示例:
python
from collections import ChainMap
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
cm = ChainMap(dict1, dict2)
print(cm["b"]) # 2(优先查找 dict1)
print(cm["c"]) # 4(dict2 中找到)
7. UserDict、UserList、UserString
python
from collections import UserDict
class MyDict(UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 2)
d = MyDict({"a": 1})
d["b"] = 2 # 自动将值翻倍
print(d) # {'a': 1, 'b': 4}
适用场景总结
| 数据结构 | 典型场景 |
|---|---|
namedtuple |
替代简单类,表示不可变数据结构(如坐标、数据库记录) |
deque |
高频头尾操作(如消息队列、滑动窗口算法) |
Counter |
统计元素频率(如词频统计、投票计数) |
defaultdict |
处理缺失键的字典(如分组聚合、树形结构) |
OrderedDict |
需要保持插入顺序或手动调整顺序的字典 |
ChainMap |
多层级配置覆盖(如默认配置 + 用户配置 + 环境配置) |
注意事项
-
性能优化:
deque的头部操作复杂度为 O(1),而list的头部插入/删除为 O(n)。Counter的update()方法比手动循环更高效。-
版本兼容性:
- Python 3.7+ 的普通
dict已支持有序性,OrderedDict主要用于旧版本或额外方法。 -
线程安全:
collections中的数据结构默认非线程安全,需自行加锁。
总结
namedtuple、deque、Counter、defaultdict 最常用。UserDict、UserList 等可自定义容器行为。deque 的双端操作)。作者:wanglaqqqq