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

从现有字典创建defaultdict后新增键值对触发KeyError问题

问题原因与解决方案

问题根源

你初始化default_dict时,传入的normal_dict里的"test"对应的值是普通字典,不是defaultdict。defaultdict的默认值规则只作用于它自身的顶层键,不会自动将已存在的嵌套普通字典转换为defaultdict。所以当你访问default_dict['test']['test4']时,['test']对应的是普通字典,无法自动创建不存在的键'test4',从而触发KeyError。

解决方案1:递归构建全嵌套defaultdict

如果需要所有嵌套层级都具备自动创建键的能力,可以用递归的方式把普通字典转换成嵌套的defaultdict:

from collections import defaultdict

def nested_defaultdict():
    return defaultdict(nested_defaultdict)

def convert_to_nested_dd(d):
    result = nested_defaultdict()
    for key, val in d.items():
        if isinstance(val, dict):
            result[key] = convert_to_nested_dd(val)
        else:
            result[key] = val
    return result

normal_dict = {
    "test": {
        "test1": 1,
        "test2": 2,
        "test3": {
            "test3_1": 1
        }
    }
}

default_dict = convert_to_nested_dd(normal_dict)
default_dict['test']['test4']['test4_1'] = 1
print(default_dict)

解决方案2:手动替换指定层级为defaultdict

如果只需要特定嵌套层级具备自动创建键的能力,可以手动把普通字典替换成defaultdict:

from collections import defaultdict

normal_dict = {
    "test": {
        "test1": 1,
        "test2": 2,
        "test3": {
            "test3_1": 1
        }
    }
}

# 将"test"对应的普通字典替换为defaultdict
normal_dict["test"] = defaultdict(dict, normal_dict["test"])
default_dict = defaultdict(lambda: defaultdict(dict), normal_dict)

default_dict['test']['test4']['test4_1'] = 1
print(default_dict)

内容的提问来源于stack exchange,提问作者bravesheeptribe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:45:48