导读:本期聚焦于小伙伴创作的《Python中的collections模块是什么?它提供了哪些常用数据结构?》,敬请观看详情。标准库里的list和dict用久了总会碰到计数麻烦、队列顺序错乱这类事。collections模块就是专门补这些短板的容器工具集,它在内置类型上做了扩展。比如想统计一段文本里每个词出现几次,用dict硬写要判空再累加,Counter一行就解决。deque支持两端高效增删,适合做任务队列。namedtuple让元组带字段名,比下标取值直观。OrderedDict能记住键的插入顺序,defaultdict给缺失键自动补默认值。理解这些结构的底层实现和适用边界,能少写很多重复逻辑,也让代码更易维护。

Python自带的collections模块位于标准库内,是对内置容器类型的补充和增强。它提供了一系列专门化的数据结构,用来解决普通list、dict、tuple在实际开发中不够顺手的问题。这些结构都经过C层面优化,既保持了Pythonic的简洁写法,又在特定场景下显著提升了效率与可读性。

Python中的collections模块是什么?它提供了哪些常用数据结构?

collections模块的整体定位与底层设计

从语言设计角度看,Python内置的list、dict、set、tuple已经覆盖了大部分基础需求,但它们是通用容器,并不针对某些高频模式做优化。collections模块的出现并不是要替代内置类型,而是把开发中反复出现的“小模式”抽象成现成工具。例如统计频次、保持插入顺序、双端操作等,如果每次都手搓循环,既容易出错也拖慢开发速度。

在CPython实现中,collections里的大部分类(如deque、Counter、OrderedDict)要么是用C实现,要么在关键路径上做了特殊优化。以deque为例,它底层是双向链表块结构,因此在头尾插入和弹出都是近似O(1),而list在头部插入却是O(n)。这种底层差异决定了我们在写队列、滑动窗口时应该优先选deque而不是list。理解模块的定位,能帮助我们在面对具体问题时快速判断该不该用它。

另外,collections中的类型大多遵循了Python的抽象基类协议,比如它们都实现了__iter__、__len__、__contains__等方法,所以可以无缝接入for循环、in判断等语法。这种一致性让代码风格保持统一,也降低了学习成本。我们不必担心用了特殊结构后,原有代码逻辑要大规模改写。

高频数据结构Counter与defaultdict详解

Counter是最常被用到的计数器工具,它继承自dict,专门用来统计可哈希对象的出现次数。假设我们有一串单词列表,想看每个单词频率,传统写法要先判断键是否存在,再累加;而Counter直接接收可迭代对象就能生成频次映射。它还提供了most_common方法,可以轻松拿出前N个高频项,在做词频分析或日志排错时非常实用。

from collections import Counter

words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
cnt = Counter(words)
print(cnt)                # Counter({'apple': 3, 'banana': 2, 'orange': 1})
print(cnt.most_common(2)) # [('apple', 3), ('banana', 2)]

# 支持算术操作
extra = Counter(['apple', 'pear'])
print(cnt + extra)        # Counter({'apple': 4, 'banana': 2, 'orange': 1, 'pear': 1})

defaultdict则是另一个解决“键不存在”痛点的结构。普通dict访问不存在的键会抛KeyError,而defaultdict在初始化时接收一个工厂函数,当键缺失时就自动调用该函数生成默认值。比如做分组归类时,用list作为默认工厂,就能直接append而无需先判断。这比用setdefault写法更直观,也少了一次查询。

from collections import defaultdict

group = defaultdict(list)
data = [('a', 1), ('b', 2), ('a', 3)]
for k, v in data:
    group[k].append(v)
print(group)  # defaultdict(<class 'list'>, {'a': [1, 3], 'b': [2]})

两者相比,Counter侧重于“计数与频次排序”,defaultdict侧重于“按 Key 自动初始化容器”。在真实项目中,它们经常组合使用,比如先用defaultdict(list)分组,再用Counter统计每组内的子项分布。这种搭配能省掉大量样板代码。

双端队列deque与命名元组namedtuple实战

deque全称double-ended queue,支持从两端快速增删。它特别适合实现队列、栈以及滑动窗口。由于list在头部操作要移动全部元素,数据量大时性能差距明显。deque还支持maxlen参数,当设定最大长度后,一侧压入数据另一侧会自动丢弃,这对保留最近N条日志或消息非常方便。

from collections import deque

dq = deque(maxlen=3)
for i in range(5):
    dq.append(i)
print(dq)  # deque([2, 3, 4], maxlen=3)

dq.appendleft(99)
print(dq)  # deque([99, 2, 3], maxlen=3)

namedtuple用来创建带字段名的元组。普通元组靠下标访问,代码可读性差且容易写错位置。namedtuple既保留了元组的轻量和不可变特性,又允许用属性名取值,还能通过_make和_asdict等方法与字典互转。在解析固定格式记录、返回多值函数结果时很常用。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)        # 10 20
d = p._asdict()
print(d)               # {'x': 10, 'y': 20}

综合来看,deque解决了顺序容器的端点效率问题,namedtuple解决了元组语义模糊的问题。它们和前面的Counter、defaultdict一起,构成了collections模块最实用的核心部分。在写工具脚本或业务代码时,优先想到这些结构,往往能让逻辑更短、更稳、更易测。

Pythoncollections数据结构修改时间:2026-08-15 16:44:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。