前言
大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到 苦练Python第32天 !
今天,我们打开 Python 的 collections 模块 ------一座超越 dict
、list
、tuple
、set
的高性能数据结构宝库。
一起拆解最实用的五大工具,配合简洁示例,让代码更优雅、运行更快。🧠
📦 什么是 collections 模块?
collections 是 Python 内置库,提供 专用容器数据类型 ,助你写出更干净、更高效的代码。
本文重点聚焦五大成员:
Counter
defaultdict
OrderedDict
deque
namedtuple
1. 🔢 Counter
------ 计数如此简单
Counter
用于统计可迭代对象中各元素出现次数。
✅ 示例
python
from collections import Counter
fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
count = Counter(fruits)
print(count)
🧪 输出
arduino
Counter({'apple': 3, 'banana': 2, 'orange': 1})
读取单个计数:
python
print(count['apple']) # 3
2. 🧰 defaultdict
------ 拒绝 KeyError
defaultdict
允许为缺失键设置 默认值类型,无需手动检查键是否存在。
✅ 示例
python
from collections import defaultdict
grades = defaultdict(int)
grades['Alice'] += 1
grades['Bob'] += 5
print(grades)
🧪 输出
arduino
defaultdict(<class 'int'>, {'Alice': 1, 'Bob': 5})
你也可以使用 list
、set
或自定义函数作为默认工厂。
3. 📜 OrderedDict
------ 记住插入顺序(Python 3.7 之前)
在旧版本 Python 中(3.7 之前),普通 dict
不保证 插入顺序。
OrderedDict
可确保顺序不变。
✅ 示例
python
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od)
🧪 输出
css
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
注:自 Python 3.7 起,普通
dict
已保留插入顺序。
4. 🔄 deque
------ 双端高效增删
deque
(double-ended queue)是一个 双端队列,在两端添加/删除元素都非常高效。
✅ 示例
python
from collections import deque
dq = deque([1, 2, 3])
dq.append(4) # 右侧追加
dq.appendleft(0) # 左侧追加
print(dq) # deque([0, 1, 2, 3, 4])
dq.pop() # 移除右侧
dq.popleft() # 移除左侧
非常适合 队列 、栈 或 滑动窗口 场景。
5. 🧱 namedtuple
------ 带字段名的元组
无需定义完整类,即可创建 轻量级、可读性强 的数据对象。
✅ 示例
python
from collections import namedtuple
Person = namedtuple('Person', 'name age')
p = Person('Alice', 30)
print(p.name) # Alice
print(p.age) # 30
行为类似元组,却更 自解释。
🧠 速查表
集合类型 | 作用 | 类比 |
---|---|---|
Counter |
统计元素出现次数 | 频次映射表 |
defaultdict |
避免键缺失异常 | 带默认值的字典 |
OrderedDict |
按插入顺序保存键值(旧版本) | 有序映射 |
deque |
双端高效增删 | 更快的列表 |
namedtuple |
给元组字段起名 | 轻量级类 |
🔍 实战场景:日志分析
假设要统计访问日志中 IP 出现次数:
python
from collections import Counter
with open("access.log") as f:
ips = [line.split()[0] for line in f]
ip_counts = Counter(ips)
print(ip_counts.most_common(5)) # 输出前 5 名 IP
🧪 动手练
使用 Counter
实现单词计数:
python
text = "hello world hello hello code world python code"
# 你的代码:输出每个单词的出现次数
最后感谢阅读!欢迎关注我,微信公众号 :
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!