如何优雅地为多层Python字典添加元素?避免KeyError
解决多层Python字典直接赋值的优雅方案
1. 递归嵌套的defaultdict
这是最常用的方案,利用collections.defaultdict的递归特性,让默认工厂函数返回自身实例,不管嵌套多少层,访问不存在的键都会自动创建空字典:
from collections import defaultdict def nested_dict(): return defaultdict(nested_dict) d = nested_dict() d["key1"]["key2"]["key3"] = 10 print(d["key1"]["key2"]["key3"]) # 输出10 # 支持任意深度嵌套 d["a"]["b"]["c"]["d"]["e"] = "test" print(d["a"]["b"]["c"]["d"]["e"]) # 输出test
如果需要把嵌套的defaultdict转为普通字典,可以用递归转换函数:
def to_regular_dict(nested): if isinstance(nested, defaultdict): return {k: to_regular_dict(v) for k, v in nested.items()} return nested regular_d = to_regular_dict(d) print(regular_d)
2. 自定义嵌套字典类(重写__missing__方法)
继承dict并重写__missing__方法,访问不存在的键时自动生成新的嵌套字典,本身就是标准字典子类,无需额外转换:
class NestedDict(dict): def __missing__(self, key): self[key] = NestedDict() return self[key] d = NestedDict() d["key1"]["key2"]["key3"] = 10 print(d["key1"]["key2"]["key3"]) # 输出10 d["x"]["y"]["z"]["w"] = 20 print(d["x"]["y"]["z"]["w"]) # 输出20
3. 临时场景:setdefault链式调用
如果只是偶尔需要多层赋值,不想定义额外函数或类,可以用dict.setdefault链式调用,适合层数较少的场景:
d = {} d.setdefault("key1", {}).setdefault("key2", {})["key3"] = 10 print(d["key1"]["key2"]["key3"]) # 输出10
内容的提问来源于stack exchange,提问作者wowonline
相关产品推荐
相关产品推荐

