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
等工具,提供了顺序控制和字典合并的功能,适用于更复杂的需求。