You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地为多层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:06:00