collections
是 Python 标准库中一个非常实用的模块,提供了多种高效的数据容器类型,用于替代 Python 内置容器(如 list
、dict
、tuple
)在特定场景下的不足。以下是 collections
模块中常用类的功能方法详解及示例:
1. defaultdict
(默认字典)
- 作用:自动为不存在的键提供一个默认值,避免
KeyError
。 - 常用方法:
- 初始化时需指定默认值的类型(如
int
,list
,set
等)。
- 初始化时需指定默认值的类型(如
- 示例:
from collections import defaultdict # 默认值为 int(即 0) count = defaultdict(int) count['apple'] += 1 # 无需初始化,直接操作 print(count) # defaultdict(<class 'int'>, {'apple': 1}) # 默认值为 list groups = defaultdict(list) groups['fruits'].append('apple') groups['fruits'].append('banana') print(groups['fruits']) # ['apple', 'banana']
2. Counter
(计数器)
- 作用:快速统计可迭代对象中元素的频率。
- 常用方法:
most_common(n)
:返回出现频率最高的前n
个元素及其计数。elements()
:返回所有元素的迭代器。- 算术运算支持(如
+
,-
,&
,|
)。
- 示例:
from collections import Counter words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] word_counts = Counter(words) print(word_counts) # Counter({'apple': 3, 'banana': 2, 'orange': 1}) print(word_counts.most_common(2)) # [('apple', 3), ('banana', 2)] # 合并 Counter more_words = ['apple', 'orange'] word_counts.update(more_words) print(word_counts['apple']) # 4
3. deque
(双端队列)
- 作用:高效实现队列(先进先出)或栈(后进先出),支持两端快速插入和删除。
- 常用方法:
append(x)
:在右端添加元素。appendleft(x)
:在左端添加元素。pop()
:移除右端元素。popleft()
:移除左端元素。rotate(n)
:向右循环移动元素(n
为正时)或向左(n
为负)。
- 示例:
from collections import deque dq = deque([1, 2, 3]) dq.append(4) # 右端添加 -> [1,2,3,4] dq.appendleft(0) # 左端添加 -> [0,1,2,3,4] dq.pop() # 移除 4 dq.popleft() # 移除 0 # 循环移动 dq.rotate(1) # [3,1,2] dq.rotate(-1) # [1,2,3]
4. OrderedDict
(有序字典)
- 作用:保持键的插入顺序(Python 3.7+ 后默认
dict
已有序,但此类型仍用于兼容性)。 - 常用方法:
move_to_end(key)
:将某个键移动到字典的末尾或开头。
- 示例:
from collections import OrderedDict od = OrderedDict() od['a'] = 1 od['b'] = 2 od['c'] = 3 print(list(od.keys())) # ['a', 'b', 'c'] od.move_to_end('a') # 将 'a' 移动到末尾 print(list(od.keys())) # ['b', 'c', 'a']
5. namedtuple
(命名元组)
- 作用:创建带有命名字段的元组,提高代码可读性。
- 常用方法:
- 定义时需要指定名称和字段列表。
- 示例:
from collections import namedtuple # 定义一个名为 'Point' 的元组,含 x 和 y 字段 Point = namedtuple('Point', ['x', 'y']) p = Point(10, y=20) print(p.x, p.y) # 10 20 print(p[0], p[1]) # 10 20 (仍支持索引)
6. ChainMap
(链式映射)
- 作用:将多个字典合并为一个逻辑视图,查找时按顺序依次搜索。
- 常用方法:
new_child(dict)
:添加新的字典到链的开头。
- 示例:
from collections import ChainMap dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} chain = ChainMap(dict1, dict2) print(chain['a']) # 1 (来自 dict1) print(chain['b']) # 2 (dict1 中的值优先) print(chain['c']) # 4 (来自 dict2)
总结
defaultdict
:处理字典键缺失时的默认值。Counter
:快速统计频率,尤其适合文本处理。deque
:高效实现队列/栈,支持两端操作。namedtuple
:增强元组的可读性,适合轻量级数据结构。OrderedDict
:需要保持插入顺序的字典(Python 3.7+ 已内置支持)。ChainMap
:逻辑合并多个字典的场景。
通过这些工具,可以显著简化代码并提升性能。