Python 在具有相同键名的嵌套列表中循环嵌套字典

Python loop over nested dict inside nested list with same key names

我有一个这样的 json 文件:

{
    "results": [        
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 0,
                "name": "name",
                "test_requires": "all",
            }
        }
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 1,
                "name": "name",
                "test_requires": "one",
            }
        }
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 2,
                "name": "main",
                "test_requires": "one",
            }
        }
    ]
    }

所以我想遍历这个文件并从每个嵌套的字典中获取几个键值,这些键值也嵌套到列表中

类似于:

result = []
reuslt2 = []
templates = json.load(jsonfile)
for item in templates[results][0]:
    result.append(templates[results][0][id]
    result2.append(templates[results[0][name]

显然这是行不通的,因为它只从第一个嵌套的字典开始循环 id:0

我怎样才能成功循环到这个嵌套的 dict - 列表一直到 python 才能工作?

谢谢。

我想你的意思(json 文件格式正确)-

{
"results": [        
    {
        "rule": {
            "description": "a",
            "engine": "b",
            "id": 0,
            "name": "name",
            "test_requires": "all"
        }
    },
    {
        "rule": {
            "description": "a",
            "engine": "b",
            "id": 1,
            "name": "name",
            "test_requires": "one"
        }
    },
    {
        "rule": {
            "description": "a",
            "engine": "b",
            "id": 2,
            "name": "main",
            "test_requires": "one"
        }
    }
]
}

作为您的 json 文件

这就是你想要的-

import json

result = []
result2 = []

with open('./records.json') as f:
    templates = json.load(f)
    for item in templates["results"]:
        result.append(item["rule"]["id"])
        result2.append(item["rule"]["name"])
print(result)
print(result2)

如果您事先不知道 idname 可能在什么级别,则必须使用递归:

templates = {
    "results": [        
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 0,
                "name": "name",
                "test_requires": "all",
            }
        },
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 1,
                "name": "name",
                "test_requires": "one",
            }
        },
        {
            "rule": {
                "description": "a",
                "engine": "b",
                "id": 2,
                "name": "main",
                "test_requires": "one",
            }
        }
    ]
    }

ids = []
names = []

def get_ids_and_names(templ):
    if isinstance(templ, dict):
        if 'id' in templ:
            ids.append(templ['id'])
        if 'name' in templ:
            names.append(templ['name'])
        for val in templ.values():
            get_ids_and_names(val)
    elif isinstance(templ, list):
        for elt in templ:
            get_ids_and_names(elt)

get_ids_and_names(templates)

print(ids)
print(names)

输出:

[0, 1, 2]
['name', 'name', 'main']