【问题标题】:Elegant way to set values in a nested json in python在python中的嵌套json中设置值的优雅方法
【发布时间】:2019-02-06 05:20:14
【问题描述】:

我正在嵌套 JSON 中设置一些值。在 JSON 中,不必总是存在密钥。
我的示例代码如下所示。

if 'key' not in data:
    data['key'] = {}
if 'nested_key' not in data['key']:
    data['key']['nested_key'] = some_value

还有其他优雅的方式来实现这一点吗?简单地分配没有if's 之类的值 - data['key']['nested_key'] = some_value 有时会抛出KeyError

我在 StackOverflow 上提到了多个关于“获取嵌套 JSON”的类似问题,但没有一个满足我的要求。所以我添加了一个新问题。如果这是一个重复的问题,那么一旦引导到正确的问题,我就会删除这个问题。

谢谢

【问题讨论】:

  • 在python字典的情况下,要检索键的值,我们需要进行键检查。但是为了给一个键赋值,即使这个键不存在,也会创建一个新的键。
  • 是的,但在我的情况下,如果两者都不存在,则嵌套键会导致 KeyError。

标签: python json code-cleanup


【解决方案1】:

请注意,对于插入,您不需要检查密钥,您可以直接添加它。但是,可以使用 defaultdict。对于列表之类的值,它特别有用。

from collections import defaultdict

data = defaultdict(dict)
data['key']['nested_key'] = some_value

defaultdict 将确保您永远不会遇到关键错误。如果该键不存在,它会返回一个您初始化它的类型的空对象。

基于列表的示例:

from collections import defaultdict

data = defaultdict(list)
data['key'].append(1)

否则必须像下面这样:

data = {}
if 'key' not in data:
    data['key'] = ['1']
else:
    data['key'].append('2')

基于现有字典的示例:

from collections import defaultdict

data = {'key1': 'sample'}    
data_new = defaultdict(dict,data)    
data_new['key']['something'] = 'nothing'

print data_new

输出:

defaultdict(<type 'dict'>, {'key1': 'sample', 'key': {'something': 'nothing'}})

【讨论】:

  • defaultdict 的第一个参数应该是 callable 还是 None 对吧?此外,当我尝试使用嵌套字典的 defaultdict 时,它仍然给我 KeyError from collections import defaultdict data = {} dic = defaultdict(None, data) dic['something']['new'] = 'hello' KeyError: 'something'
  • @ManthanJamdagni,请查看我更新的答案。它不会为嵌套字典引发错误。按照我的方式使用它。
  • 嗨@Jay,可能我没有很清楚地表达这个问题,但我已经有一个字典,我必须将它变成一个默认字典才能实现我想要的。所以对我来说,代码是-data1 = defaultdict(dict, data) 。还是谢谢。
  • @ManthanJamdagni,对不起,我误解了。你说的对。您的代码将是 data1 = defaultdict(dict, data)。我也更新了我的答案。
【解决方案2】:

你可以写在一个语句中:

data.setdefault('key', {})['nested_value'] = some_value

但我不确定它看起来是否更优雅。

PS:如果您更喜欢使用 Jay 建议的 defaultdict,您可以使用 json.loads() 返回的原始 dict 初始化新 dict,然后将其传递给 json.dumps()

data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2)    # print the expected dict

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多