【问题标题】:Access all keys including lists in JSON using Python使用 Python 访问所有键,包括 JSON 中的列表
【发布时间】:2021-12-18 17:18:59
【问题描述】:

我想访问包括 JSON 文档中列表在内的所有键并修改它们。

我有以下代码,但这只是打印顶级键:

#!/usr/bin/env python3

import json

file = 'example.json'
f = open(file)
data = json.load(f)

for key, value in data.items():
        print(key)

因此,对于 JSON 文档:

{
"a":1,
"b":2,
"c":[
     {
     "d":4,
     "e":5,
     "f":{
         "g":6
         }
     }
    ]
}

我只是得到输出:

a
b
c

而我想访问和修改所有密钥,即:

a
b
c
d
e
f
g

注意c 是一个列表,它隐藏了d e f g

【问题讨论】:

  • 这里需要递归方法。

标签: python json dictionary recursion nested


【解决方案1】:

您将需要某种递归来遍历数据:

def nested_keys(obj):
    if isinstance(obj, dict):
        for k, v in obj.items():
            yield k
            yield from nested_keys(v)
    elif isinstance(obj, list):
        for sub in obj:
            yield from nested_keys(sub)

>>> [*nested_keys(data)]
['a', 'b', 'c', 'd', 'e', 'f', 'g']

要重命名键:

def rename_keys(obj, mapping):
    if isinstance(obj, dict):
        return {mapping[k]: rename_keys(v, mapping) for k, v in obj.items()}
    if isinstance(obj, list):
        return [rename_keys(sub, mapping) for sub in obj]
    return obj

rename_keys(data, dict("a1 b2 c3 d4 e5 f6 g6".split()))
# {'1': 1, '2': 2, '3': [{'4': 4, '5': 5, '6': {'6': 6}}]}

【讨论】:

  • 另外一个 - 问题是您可能无法对嵌套键执行任何操作(即无法单独使用键名获取值)。
  • 感谢@user2390182,它会打印出所有的密钥。我将如何更改键名?我尝试定义一个新的全局字典data2 = { } 并在for k, v in obj.items: 行之后添加data2[k + '0'] = obj[k],但结果是data2 = {'a0': 1, 'b0': 2, 'c0': [{'d': 4, 'e': 5, 'f': {'g': 6}}], 'd0': 4, 'e0': 5, 'f0': {'g': 6}, 'g0': 6}。即新的keys已经添加到列表中,但是旧的keys并没有被删除。
  • 能否提供一些关于重命名逻辑的提示
  • 我有一个包含旧键名和新键名的 Python 字典。理想情况下,我想就地替换键名,但我也可以从现有的 JSON 文档创建一个新的 JSON 文档。
  • 添加了一个示例来创建一个新的字典,其中的键替换为从映射中获取的替换键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多