collections 模块是 Python 标准库中的一个强大工具,它提供了许多有用的数据结构,能够扩展 Python 的内建数据类型,并且支持许多高级操作。以下是 collections 模块中的常用 API:
1. Counter
Counter 是一个字典子类,用于计数元素的出现次数。
- 方法:
elements(): 返回一个迭代器,返回所有元素的重复出现。most_common(n): 返回出现次数最多的n个元素。update(): 更新计数器,可以接受一个可迭代对象或另一个Counter对象。
2. deque
deque 是一个双端队列(双向队列),可以从两端高效地插入和删除元素。
- 构造函数:
deque([iterable], maxlen=N): 创建一个双端队列,可以传入一个可迭代对象,也可以指定最大长度maxlen。
- 常用方法:
append(x): 向右添加一个元素。appendleft(x): 向左添加一个元素。pop(): 从右侧移除并返回一个元素。popleft(): 从左侧移除并返回一个元素。extend(iterable): 向右侧扩展一个可迭代对象。extendleft(iterable): 向左侧扩展一个可迭代对象(注意顺序会反转)。rotate(n): 旋转队列,将元素向右移动n位。
3. defaultdict
defaultdict 是 dict 的子类,它提供了一个默认值的功能,在访问不存在的键时会返回一个默认值,而不抛出 KeyError。
- 构造函数:
defaultdict(default_factory):default_factory是一个可调用对象,用来为不存在的键生成默认值。
- 常用方法:
defaultdict继承自dict,所以具有dict的所有方法。唯一不同的是,当你访问一个不存在的键时,defaultdict会自动创建并返回一个默认值,而不是抛出异常。
4. namedtuple
namedtuple 用于创建具有命名字段的元组,允许通过字段名而不是索引来访问元组元素。
- 构造函数:
namedtuple(typename, field_names):typename是类名,field_names是字段名,可以是一个字符串(以空格或逗号分隔的字段名)或可迭代对象(如列表)。
- 方法:
- 通过字段名访问元素:
tuple.fieldname。_asdict(): 返回一个OrderedDict,以字段名为键,元组元素为值。_replace(): 返回一个新的命名元组,可以替换指定的字段。_fields: 返回字段名的元组。
- 通过字段名访问元素:
from collections import namedtuple
# 定义一个命名元组
Point = namedtuple('Point', 'x y')
# 创建实例
p = Point(1, 2)
print(p.x, p.y) # 输出: 1 2
print(p._asdict()) # 输出: OrderedDict([('x', 1), ('y', 2)])5. OrderedDict
OrderedDict 是一个有序字典,记住键值对的插入顺序。在 Python 3.7 之前,普通字典 dict 不保证顺序,而 OrderedDict 允许有序操作。
- 构造函数:
OrderedDict([items]): 创建一个有序字典,可以传入一个可迭代的键值对(如元组的列表)来初始化。
- 常用方法:
move_to_end(key, last=True): 移动指定的键值对到字典的开头或末尾。popitem(last=True): 移除并返回一个键值对。如果last=True,移除最后一个元素;如果last=False,移除第一个元素。
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # 输出: OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od.move_to_end('b')
print(od) # 输出: OrderedDict([('a', 1), ('c', 3), ('b', 2)])6. ChainMap
ChainMap 用于将多个字典或映射对象合并为一个逻辑上的字典,允许你在多个字典中查找键值对。
- 构造函数:
ChainMap(*maps): 将多个字典或映射合并为一个ChainMap对象。
- 常用方法:
maps: 返回链式映射对象中的所有字典。new_child(): 创建一个新的ChainMap,将其添加到当前映射链的最前面。parents: 返回一个没有当前字典的新ChainMap。
from collections import ChainMap
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
cm = ChainMap(d1, d2)
print(cm) # 输出: ChainMap({'a': 1, 'b': 2}, {'b': 3, 'c': 4})
print(cm['b']) # 输出: 2(会首先查找 d1)7. UserDict
UserDict 是 dict 的一个包装类,它允许用户继承并自定义字典的行为。通常用于需要自定义字典行为的场景。
- 构造函数:
UserDict(mapping=None): 初始化一个UserDict对象,可以通过传入一个字典来初始化。
- 常用方法:
- 继承
dict的大部分方法,可以重写它们来自定义行为。
- 继承
8. UserList
UserList 是 list 的一个包装类,允许用户继承并自定义列表的行为。它通常用于需要自定义列表行为的场景。
- 构造函数:
UserList(iterable=None): 初始化一个UserList对象,可以通过传入一个可迭代对象来初始化。
9. UserString
UserString 是 str 的一个包装类,允许用户继承并自定义字符串的行为。
- 构造函数:
UserString(str=None): 初始化一个UserString对象,可以通过传入一个字符串来初始化。
总结
collections 模块提供了很多非常有用的高级数据结构和工具,能够简化许多常见的编程任务。最常用的 Counter、deque、defaultdict 和 namedtuple,这些工具能帮助你以更简洁、高效的方式解决问题。此外,OrderedDict 和 ChainMap 等工具,提供了顺序控制和字典合并的功能,适用于更复杂的需求。