【万字长文详解】Python库collections,让你击败99%的Pythoner

【万字长文详解】Python库collections,让你击败99%的Pythoner
最新回答
差不多先森丶

2026-04-15 12:33:37

collections模块是Python中一个强大的工具库,提供了多种高效的数据结构,能够显著提升代码的简洁性和执行效率。 以下是对该模块核心功能的详细解析:

一、模块概述
  1. 模块作用

    官方定义:提供标准内建容器(如dict、list、set、tuple)的替代选择,实现特定目标的容器。

    通俗理解:扩展内置数据类型的功能,例如OrderedDict支持有序字典,Counter用于高效计数。掌握后可简化代码逻辑,提升开发效率。

  2. 模块子类通过collections.__all__可查看所有子类,包括:

    deque:双端队列,支持快速两端操作。

    Counter:计数器,统计可哈希对象。

    OrderedDict:有序字典,保留插入顺序。

    defaultdict:带默认值的字典。

    namedtuple:命名元组,增强可读性。

    其他如ChainMap、UserDict等(详见官方文档)。

二、计数器(Counter)
  1. 基础功能

    统计频率:直接统计列表、字符串或字典中的元素出现次数。

    from collections import Counterwords = ['red', 'blue', 'red', 'green']Counter(words) # Counter({'red': 2, 'blue': 1, 'green': 1})

    支持多种输入:字符串、列表、字典或关键字参数均可初始化。

  2. 核心方法

    elements():按计数重复生成元素迭代器。

    c = Counter(a=2, b=1)list(c.elements()) # ['a', 'a', 'b']

    most_common(n):返回前n个高频元素及计数。

    Counter('abracadabra').most_common(2) # [('a', 5), ('b', 2)]

    subtract():减去另一个计数器的计数(允许负值)。

    c = Counter(a=3); c.subtract(Counter(a=1)); c # Counter({'a': 2})
  3. 数学操作

    支持运算符:如+(合并计数)、-(差集)、&(交集取最小值)、|(并集取最大值)。

    c1 = Counter(a=3, b=1); c2 = Counter(a=1, b=2)c1 & c2 # Counter({'a': 1, 'b': 1})
  4. 应用示例:文本相似度计算通过统计高频词交集与并集的比例计算相似度:

    def str_sim(str0, str1, topn): c0 = Counter(str0).most_common(topn) c1 = Counter(str1).most_common(topn) jiao = sum((Counter(dict(c0)) & Counter(dict(c1))).values()) bing = sum((Counter(dict(c0)) | Counter(dict(c1))).values()) return jiao / bing if bing else 0
三、双向队列(deque)
  1. 特性

    基于双向链表实现,适合频繁的头部/尾部插入删除操作(时间复杂度O(1))。

    对比list:list的头部操作是O(n),而deque更高效。

  2. 常用方法

    append(x) / appendleft(x):右侧/左侧添加元素。

    pop() / popleft():右侧/左侧弹出元素。

    extend(iterable) / extendleft(iterable):扩展右侧/左侧(注意extendleft会反转顺序)。

    rotate(n):循环移动元素(正数向右,负数向左)。

    d = deque([1, 2, 3]); d.rotate(1); d # deque([3, 1, 2])
  3. 应用场景

    滑动窗口问题(如最近N条日志)。

    广度优先搜索(BFS)中的队列实现。

四、其他实用工具
  1. OrderedDict

    保留键的插入顺序,适合需要有序输出的场景。

    示例:按插入顺序遍历字典。

    od = OrderedDict([('a', 1), ('b', 2)]); od.keys() # odict_keys(['a', 'b'])
  2. defaultdict

    自动初始化缺失键的默认值,避免KeyError。

    示例:统计列表中元素的出现位置。

    dd = defaultdict(list)for i, item in enumerate(['a', 'b', 'a']): dd[item].append(i) # defaultdict(<class 'list'>, {'a': [0, 2], 'b': [1]})
  3. namedtuple

    创建带字段名的元组,提升代码可读性。

    示例:定义二维点结构。

    Point = namedtuple('Point', ['x', 'y'])p = Point(11, y=22); p.x + p.y # 33
五、总结
  • 优势:collections模块通过提供高性能数据结构,简化了复杂逻辑的实现(如计数、有序存储、双端操作)。
  • 学习建议

    初学者可先掌握Counter和defaultdict,快速提升代码效率。

    进阶用户可深入deque和OrderedDict,优化特定场景性能。

  • 参考文档

    中文官方文档

    英文官方文档

通过灵活运用这些工具,能够显著提升Python代码的简洁性、可读性和执行效率。