Python collections模块详解
很多Python开发者刚入门时,用的都是内置的dict、list、tuple这些通用容器,但当场景变复杂——比如做快速双端插入、优雅的缺失键处理、精准的元素计数——内置容器要么效率不足,要么代码会变得啰嗦混乱。
这时候Python标准库的宝藏模块collections就能直接救场!它内置了7+种针对特定场景优化的集合类,既保持了和内置容器的兼容性,又加了不少实用功能。今天我们挑核心、高频的来逐一拆解。
1. namedtuple:带名字的不可变元组
普通元组的问题是元素只能靠索引访问,代码过段时间看根本记不住索引0是啥、索引1是啥。namedtuple就是为了解决这个痛点的:它是tuple的子类,每个字段都有专属的属性名,同时保留了元组的不可变、内存高效等特性。
基本用法
核心特点
- 完全兼容元组:可以用索引、切片、
len()、in、for循环等所有元组操作 - 内存效率极高:和普通元组几乎没有区别,比自定义轻量类快且省内存
- 不可变:属性和值都不能修改
进阶小技巧
2. deque:双端队列(Queue/Stack的优化版)
list虽然也能模拟队列(从头部insert(0)、尾部append())和栈(从尾部append()、pop()),但从头部插入/删除的复杂度是O(n)——元素多的时候会非常慢。
deque(全称double-ended queue)是专门为两端快速操作设计的:左右两端的append/pop复杂度都是O(1),而且线程安全!
基本用法
核心特点
- 两端O(1)操作:替代list做队列/栈首选
- 线程安全:多个线程可以同时安全地操作
- 支持最大长度限制:超出后会自动把最早加的元素挤出去
进阶小技巧
3. defaultdict:带默认值的字典
用普通dict时,最烦的就是访问不存在的键会报KeyError——比如统计单词频率,每次都要写if key in dict: dict[key] +=1 else: dict[key] =1。
defaultdict完美解决这个问题:它是dict的子类,初始化时需要传入一个默认值工厂函数,访问不存在的键时,会自动用工厂函数生成默认值并填入字典。
基本用法
核心特点
- 避免KeyError:不用写冗余的判断逻辑
- 完全兼容dict:可以用所有dict的方法,比如
keys()、values()、items()等 - 工厂函数灵活:可以用任何无参可调用对象(内置的
int/list/set,或者自己写的函数)
进阶小技巧
4. Counter:专门做计数的字典
统计频率是defaultdict(int)的一个常见场景,但Counter把这个场景做到了极致——它内置了most_common()、数学运算、多重集操作等专属功能,代码更简洁!
基本用法
核心专属功能
5. OrderedDict(3.7+更新说明)
从Python 3.7开始,普通dict已经官方保证保持键的插入顺序了,那OrderedDict还有用吗?
有用!它主要有两个普通dict没有的功能:
- 特定顺序操作:比如
move_to_end()把键移到开头/结尾 - 顺序敏感的相等性:两个
OrderedDict只有键顺序和值都相同时才相等
常用专属功能
6. 其他实用工具类
UserDict/UserList/UserString
这些是容器的包装器类,不是直接继承内置容器,但用法几乎完全一致。为什么要用它们?因为直接继承内置容器(比如dict)有时候会有一些隐藏的坑(比如某些内置方法不会调用我们重写的__setitem__),而继承UserDict/UserList/UserString就不会有这个问题。
举个自定义“缺失键返回提示”的字典例子:
总结
collections模块的核心集合类可以用一张表快速记住:
这些工具类能显著提高代码的可读性和性能,以后遇到特定场景,先别急着自己造轮子,先看看collections里有没有现成的!

