gpt4 book ai didi

python - 如何将 dict 转换为递归 defaultdict 并加载 JSON?

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:33 26 4
gpt4 key购买 nike

是否有任何方法可以使用 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>, {})

最佳答案

仅仅创建一个递归字典是不够的。您必须递归地将 JSON 对象加载到您的字典中。

您的代码中发生的事情是 ni['a'] 是一个普通的字典,而不是 nd 类型的字典。当您运行 ni.update(d) 时,update 不够智能以遍历 d,将每个级别的对象写入相似类型的对象。相反,它只是将 d 的第一级值和键复制到 ni 中。第一级值只是普通的字典或其他任何东西。

要正确初始化ni,您需要编写一个递归函数来确定每个值是字典、数组还是标量。如果它是一个字典,它必须调用 nd,然后用它将以相同递归方式执行的值填充结果。

或者,您可以使用参数 object_hookjson.loads。参见 https://docs.python.org/2/library/json.html#json.load了解详情。您在此处传递的任何函数都将在任何解析级别创建的每个字典上调用。所以函数

def defaultdict_from_dict(d):
nd = lambda: defaultdict(nd)
ni = nd()
ni.update(d)
return ni

或类似的东西可能会为您解决问题。

关于python - 如何将 dict 转换为递归 defaultdict 并加载 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50730315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com