【发布时间】:2018-11-16 17:23:34
【问题描述】:
有什么方法可以使用 Python 2.7 将 JSON 代码加载到递归 defaultdict 中以避免 KeyError?
例如:
from __future__ import print_function
from collections import defaultdict
import json
S = '{"a": [{"b": "TEST1", "p": "TEST2"}, {"b": "TEST3", "p": "TEST4"}]}'
d = json.loads(S)
nd = lambda: defaultdict(nd)
ni = nd()
print('1: ', ni['a'][0]['b'])
ni.update(d)
print('2: ', ni['a'][0]['b'])
print('3: ', ni['a'][1]['p'])
print('4: ', ni['a'][1]['c'])
结果
1: defaultdict(<function <lambda> at 0x0266F530>, {})
2: TEST1
3: TEST4
Traceback (most recent call last):
File "C:/...", line 16, in <module>
print('4: ', ni['a'][1]['c'])
KeyError: 'c'
它看起来像 ni.update(d) ni 之后的 dict,而不像递归 defaultdict。有什么方法可以将dict 添加到递归defaultdict 中并保留其属性?
我希望第 4 步的结果类似于以下内容:
4: defaultdict(<function <lambda> at 0x0266F530>, {})
【问题讨论】:
-
ni['a'][0]引用与键'a'关联的list值的第一个元素。[0]中的零是一个索引,而不是字典键(因为d只是一个普通的dict),所以你试图将字典列表的字典与递归的defaultdict混合。这意味着您需要编写代码将其转换为类似于下面@jwg's answer 中的内容。
标签: python json python-2.7 recursion defaultdict