WMX · 随记
·Python· 3 分钟阅读

defaultdict 分组:读取缺失键也可能修改字典

分组代码里反复检查键是否存在很繁琐。defaultdict 可以按需生成容器,但其读取行为也引入了容易忽略的副作用。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Learn Python — Full Course for Beginners

Python 入门课程作为语法与编程背景复习;本文使用的较新标准库特性不保证在该课程中逐项覆盖。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

分组代码里反复检查键是否存在很繁琐。defaultdict 可以按需生成容器,但其读取行为也引入了容易忽略的副作用。

理解核心机制

defaultdict(list) 在通过下标访问缺失键时调用工厂并存入结果。get 不会调用这个工厂,因此两种读取方式的行为并不一样。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python7 行 · 可横向滚动
from collections import defaultdict
groups = defaultdict(list)
for language, name in [("python", "Ada"), ("java", "Bo"), ("python", "Cy")]:
    groups[language].append(name)
assert groups.get("rust") is None
assert "rust" not in groups
print(dict(groups))

适用边界与常见误区

返回给调用方之前,可能需要转换为普通 dict,避免查询无意创建空分组。defaultdict 本身也不提供多步操作的并发事务。

继续练习

分别使用 get 和下标查询缺失键,比较 len 的变化,并写出只读展示接口希望提供的行为。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档