collections
模块是 Python 标准库中的一个强大工具,提供了多种高级数据结构,扩展了内置的数据类型(如 list
、dict
、set
、tuple
)。这些数据结构可以提高代码的可读性和效率。
1. collections 模块的主要内容
(1)namedtuple
namedtuple
创建一个类似于 tuple
的不可变对象,但它的元素可以通过 名称 访问,而不是索引。
示例:
from collections import namedtuple# 创建一个 namedtuple 类型
Point = namedtuple('Point', ['x', 'y'])p = Point(10, 20)
print(p.x, p.y) # 10 20
print(p[0], p[1]) # 10 20
用途: 适用于返回多个相关值的场景,比如点坐标、RGB 颜色等。
(2)deque(双端队列)
deque
是一个高效的双端队列(支持从两端插入/删除元素),相比 list
,它的 O(1)
复杂度的 appendleft()
和 popleft()
适用于队列和栈操作。
示例:
from collections import dequedq = deque([1, 2, 3])
dq.append(4) # 右侧添加
dq.appendleft(0) # 左侧添加
print(dq) # deque([0, 1, 2, 3, 4])dq.pop() # 右侧弹出
dq.popleft() # 左侧弹出
print(dq) # deque([1, 2, 3])
用途: 适用于FIFO 队列(如任务调度)或LIFO 栈。
(3)Counter(计数器)
Counter
用于统计可迭代对象中元素出现的次数,返回一个 dict
形式的对象。
示例:
from collections import Counterwords = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
print(counter) # Counter({'apple': 3, 'banana': 2, 'orange': 1})# 取出现次数最多的两个单词
print(counter.most_common(2)) # [('apple', 3), ('banana', 2)]
用途: 适用于文本分析、数据统计等。
(4)OrderedDict(有序字典)
OrderedDict
记录了键值对插入的顺序(Python 3.7+ 的 dict
默认也是有序的)。
示例:
from collections import OrderedDictod = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
用途: 适用于需要保持字典顺序的场景,如 JSON 解析。
(5)defaultdict(带默认值的字典)
defaultdict
允许你为字典的键提供默认值,避免 KeyError
。
示例:
from collections import defaultdict# 默认值是 list,缺失的键返回空列表
dd = defaultdict(list)
dd['a'].append(1)
dd['b'].append(2)print(dd) # defaultdict(<class 'list'>, {'a': [1], 'b': [2]})
print(dd['c']) # 返回默认值: []
用途: 适用于需要自动初始化嵌套数据结构的情况,如分组统计。
6)ChainMap(多个字典合并)
ChainMap
可以把多个字典合并,并且按顺序查找键值。
示例:
from collections import ChainMapdict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}cm = ChainMap(dict1, dict2)
print(cm['a']) # 1(来自 dict1)
print(cm['b']) # 2(dict1 覆盖 dict2)
print(cm['c']) # 4(来自 dict2)
用途: 适用于多层次配置管理,如全局变量+本地变量。
2. collections.abc 抽象基类
在 collections.abc
模块中,定义了一些常见的抽象基类(ABC,Abstract Base Classes),用于标准化各种容器类型的行为。例如:
Iterable
:可迭代对象(实现__iter__
方法)Iterator
:迭代器(实现__next__
方法)Mapping
:不可变字典(类似dict
)MutableMapping
:可变字典(类似dict
,但支持修改)
示例:
from collections.abc import Mapping, MutableMapping# dict 继承自 MutableMapping
print(issubclass(dict, MutableMapping)) # True
print(issubclass(dict, Mapping)) # True
用途: 适用于类型检查,以及自定义数据结构。
总结
collections
提供了丰富的数据结构:
- 命名元组:
namedtuple
- 高效双端队列:
deque
- 元素计数:
Counter
- 有序字典:
OrderedDict
- 默认值字典:
defaultdict
- 多字典管理:
ChainMap
- 抽象基类(ABC):
collections.abc
这些工具在数据分析、文本处理、缓存管理等场景非常有用!