关键词:Python、collections 模块、Counter、defaultdict、deque、namedtuple、OrderedDict
一、什么是 collections?
Python 的 collections 模块内置了多个增强型数据结构,相比普通的 list、dict、set 等,它们更灵活、功能更强,常用于数据分析、日志处理、状态跟踪、性能优化等场景。
二、最常用的五大数据结构解析
1️⃣ Counter:快速统计元素频次
python
复制编辑
from collections import Counter
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)
print(counter)
# Counter({'apple': 3, 'banana': 2, 'orange': 1})
print(counter.most_common(2))
# [('apple', 3), ('banana', 2)]
应用场景:
- 日志中统计错误类型频次
- 词频分析
- 投票计数器
2️⃣ defaultdict:避免 KeyError 的救星
python
复制编辑
from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
print(d)
# defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3]})
对比普通 dict:
python
复制编辑
d = {}
d['a'].append(1) # ❌ 报错 KeyError
应用场景:
- 构建倒排索引
- 分组聚合数据
- 多值映射表
3️⃣ deque:高性能的双端队列
python
复制编辑
from collections import deque
q = deque([1, 2, 3])
q.appendleft(0)
q.append(4)
print(q) # deque([0, 1, 2, 3, 4])
q.pop()
q.popleft()
print(q) # deque([1, 2, 3])
优势:
- 相比 list,
deque在头尾插入/删除元素效率更高(O(1))
应用场景:
- 队列、栈、滑动窗口
- 最近访问缓存(LRU Cache)
4️⃣ namedtuple:可读性 + 内存优化的类替代品
python
复制编辑
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x, p.y) # 1 2
print(p) # Point(x=1, y=2)
应用场景:
- 替代小型类
- 返回结构化数据
- CSV/日志解析成结构对象
5️⃣ OrderedDict(Python 3.7+已内置)
python
复制编辑
from collections import OrderedDict
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
for k in d:
print(k, end=' ') # a b c
虽然 Python 3.7+ 默认 dict 就是有序的,但 OrderedDict 仍支持:
- move_to_end() :重排元素
- popitem(last=False) :弹出第一个元素
适用场景:
- 实现 LRU 缓存
- 保存配置加载顺序
- 数据结构中需要可控顺序的操作
三、综合实战示例:分析学生考试成绩
python
复制编辑
from collections import defaultdict, Counter
scores = [
('Tom', 'math', 85),
('Tom', 'english', 90),
('Jerry', 'math', 78),
('Jerry', 'english', 88),
('Anna', 'math', 95),
]
# 按学生聚合科目成绩
result = defaultdict(dict)
for name, subject, score in scores:
result[name][subject] = score
print(result)
# {'Tom': {'math': 85, 'english': 90}, ...}
# 统计每门课的平均分
subject_scores = defaultdict(list)
for _, subject, score in scores:
subject_scores[subject].append(score)
for subject, lst in subject_scores.items():
avg = sum(lst) / len(lst)
print(f"{subject} 平均分: {avg:.2f}")
四、小结与建议
| 工具 | 作用 |
|---|---|
Counter | 频次统计、排行榜 |
defaultdict | 安全聚合、分组统计 |
deque | 队列、栈、滑动窗口、缓存 |
namedtuple | 结构数据简化版 class |
OrderedDict | 控制数据顺序、高级 dict 操作 |
💬互动话题:
你最喜欢 collections 中哪个工具?有没有在实际项目中用过这些数据结构?留言聊聊吧!
文章来源:mip.chkairui.com