当前位置:首页>python>除了list、dict、tuple,Python标准库里还藏着个“容器大合集”——collections

除了list、dict、tuple,Python标准库里还藏着个“容器大合集”——collections

  • 2026-10-11 08:34:24
除了list、dict、tuple,Python标准库里还藏着个“容器大合集”——collections

什么是collections模块?哎,平时写Python,你肯定离不开list、dict、tuple这些内置容器,可你知不知道,标准库里还藏着个“容器大合集”——collections?它就像给Python原生容器打了B级强化补丁,提供了一堆专门解决常见场景痛点的高级数据结构,让你的代码既简洁又高效。

它到底解决了哪些痛点?

  • • 列表头部插入/删除超慢?
  • • 统计单词频次,每次都写if k in d:… else:…?
  • • 想让字典记住插入顺序又不想自己手撸链表?
  • • 嵌套作用域参数上下文管理搞得你头大?统一交给collections!

主要容器一览(文字+表格)下面这张“小抄”帮你记住7大模块:

工具
用途
典型场景/特点
deque
双端队列,左右O(1)增删
实现队列、栈、滑动窗口、tail/stream处理
Counter
计数器,统计可哈希对象出现次数
单词/字符频次、找top-N
defaultdict
带默认值的字典
分组、累加、简化setdefault
OrderedDict
有序字典,支持移动、FIFO/LIFO pop
LRU缓存、需要顺序操作的场景
ChainMap
多个映射的“上下文合并”
配置优先级合并、权限控制、模板渲染
namedtuple
带字段名的元组
文件/数据库记录、结果可读性、解包
UserDict/List/String
可继承包装类
扩展dict/list/str行为,简单实现子类

代码实例时间

  1. 1. deque做一个tail函数,零代码就能读文件末尾10行:
from collections import dequedeftail(filename, n=10):withopen(filename, encoding='utf-8')as f:return deque(f, n)# 只保留最后n行print(tail('app.log',5))
  1. 1. Counter统计单词:
from collections importCounterwords ="hello world hello python".split()cnt =Counter(words)print(cnt.most_common(2))# [('hello', 2), ('world',1)]
  1. 1. defaultdict简化分组:
from collections import defaultdictpairs =[('a',1),('b',2),('a',3)]d = defaultdict(list)for k,v in pairs:    d[k].append(v)print(d)# {'a': [1,3], 'b': [2]}
  1. 1. ChainMap合并配置:
import osfrom collections importChainMapdefaults ={'color':'red','user':'guest'}cli ={'user':'alice'}env =dict(os.environ)config =ChainMap(cli, env, defaults)print(config['color'], config['user'])
  1. 1. namedtuple让代码更可读:
from collections import namedtuplePoint= namedtuple('Point','x y')p =Point(3,4)print(f"x={p.x}, y={p.y}, dist={ (p.x**2+p.y**2)**0.5 }")

优缺点简评

优点
缺点
1. 专门解决常见数据结构问题,代码更简洁
1. 需要记住API,学习成本略高
2. 性能好、底层优化,直接用即可
2. 一些场景用过度反而更复杂
3. 语义清晰,业务逻辑易读
3. Python版本差异,老项目可能兼容性小坑
4. 多种类型帮你少写边界逻辑
4. 过度依赖外来结构,调试不熟时难理解

总结说白了,collections就像给你内置容器加了一套“外挂”——专治各种常见痛点。写过几次滑动窗口你就会爱上deque,做过N次字符统计你离不开Counter,要是还手写各种if k in dict,赶紧用defaultdict省心省力。总之,建议:

  • • 项目中有合适场景,优先考虑collections里的“神器”。
  • • 不要盲目堆,用之前多问一句:“是不是默认值/双端队列/有序字典能解决?”

动动手,试试上面的小示例,把collections装进你的工具箱,Python开发立刻更高级!

最新文章

随机文章