从现有字典创建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
相关产品推荐
相关产品推荐

