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)
如果您事先不知道 id
和 name
可能在什么级别,则必须使用递归:
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']
我有一个这样的 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)
如果您事先不知道 id
和 name
可能在什么级别,则必须使用递归:
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']