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
主要用于旧版本或额外方法。
- Python 3.7+ 的普通
-
线程安全:
collections
中的数据结构默认非线程安全,需自行加锁。
总结
- 核心数据结构:
namedtuple
、deque
、Counter
、defaultdict
最常用。 - 扩展性:通过
UserDict
、UserList
等可自定义容器行为。 - 高效性:针对特定场景优化性能(如
deque
的双端操作)。