KeyError在从现有字典创建的默认字典中定义新的键值对时出错



下面是一个示例代码:

from collections import defaultdict
normal_dict = {
"test": {
"test1": 1,
"test2": 2,
"test3": {
"test3_1": 1
}
}
}
default_dict = defaultdict(lambda: defaultdict(dict), normal_dict)
default_dict['test']['test4']['test4_1'] = 1 # Doesn't work

print(default_dict)

我得到这个错误

Traceback (most recent call last):
File "<string>", line 17, in <module>
KeyError: 'test4'

由于某种原因,当我使用行default_dict['test']['test4']['test4_1']时,似乎以前不存在的键'test4'没有被自动添加。理论上,defaultdict应该用另一个defaultdict作为默认值来创建键test4

问题

问题是:

default_dict['test']

:

{'test1': 1, 'test2': 2, 'test3': {'test3_1': 1}}

换句话说,是字典而不是defaultdict。注意,defaultdict(通过工厂方法)为丢失的键提供了一个值,而在创建时不是这样:

default_dict = defaultdict(lambda: defaultdict(dict), normal_dict)

它不会复制值和"transform">

一个解

将每个嵌套字典转换为默认字典的一种方法如下:

def nested_dd():
# https://stackoverflow.com/a/19189356/4001592
return defaultdict(nested_dd)

def convert_to_default(d):
res = nested_dd()
for key, value in d.items():
if isinstance(value, dict):
res[key] = convert_to_default(value)
else:
res[key] = value
return res

result = convert_to_default(normal_dict)
result['test']['test4']['test4_1'] = 1
pprint.pprint(result)  # need to import pprint

defaultdict(<function nested_dd at 0x7fd27008bd90>,
{'test': defaultdict(<function nested_dd at 0x7fd27008bd90>,
{'test1': 1,
'test2': 2,
'test3': defaultdict(<function nested_dd at 0x7fd27008bd90>,
{'test3_1': 1}),
'test4': defaultdict(<function nested_dd at 0x7fd27008bd90>,
{'test4_1': 1})})})

最新更新