collections模块介绍

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

defaultdictdict 的子类,它提供了一个默认值的功能,在访问不存在的键时会返回一个默认值,而不抛出 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

UserDictdict 的一个包装类,它允许用户继承并自定义字典的行为。通常用于需要自定义字典行为的场景。

  • 构造函数
    • UserDict(mapping=None): 初始化一个 UserDict 对象,可以通过传入一个字典来初始化。
  • 常用方法
    • 继承 dict 的大部分方法,可以重写它们来自定义行为。

8. UserList

UserListlist 的一个包装类,允许用户继承并自定义列表的行为。它通常用于需要自定义列表行为的场景。

  • 构造函数
    • UserList(iterable=None): 初始化一个 UserList 对象,可以通过传入一个可迭代对象来初始化。

9. UserString

UserStringstr 的一个包装类,允许用户继承并自定义字符串的行为。

  • 构造函数
    • UserString(str=None): 初始化一个 UserString 对象,可以通过传入一个字符串来初始化。

总结

collections 模块提供了很多非常有用的高级数据结构和工具,能够简化许多常见的编程任务。最常用的 Counterdequedefaultdictnamedtuple,这些工具能帮助你以更简洁、高效的方式解决问题。此外,OrderedDictChainMap 等工具,提供了顺序控制和字典合并的功能,适用于更复杂的需求。

Scroll to Top