Python 字典嵌套循环遍历

这是从接口获取到的json数据

{
*   "code":"10000",
*   "charge":false,
*   "remain":0,
*   "msg":"查询成功",
*   "result":{
    *   "status":0,
    *   "msg":"ok",
    *   "result":{
        *   "total":1384,
        *   "num":5,
        *   "list":[
             {
                *   "id":1,
                *   "classid":2,
                *   "name":"炸茄盒",
                *   "peoplenum":"3-4人",
                *   "preparetime":"10分钟内",
                *   "cookingtime":"10-20分钟",
                *   "content":"炸茄盒外焦里嫩,入口不腻,咬上一口,淡淡的肉香和茄子的清香同时浮现,让人心动不已。",
                *   "pic":"http://123123~~~~/recipe/upload/20160719/115137_60657.jpg",
                *   "tag":"健脾开胃,儿童,减肥,宴请,家常菜,小吃,炸,白领,私房菜,聚会",
                *   "material":[
                    1.  {
                        *   "mname":"生粉",
                        *   "type":0,
                        *   "amount":"适量"
                        },
                        {...}
                        {...}
                        ]
                     "process":[
                    1.  {
                         *   "pcontent":"首先我们将猪肉剁成肉泥、姜切成姜米、葱切葱花、蒜子切成蒜末、茄子去皮,然后在每一小段中间切一刀,但不要切断,做成茄盒。",
                     *       "pic":"http://123123/recipe/upload/20160719/162541_29953.jpg"
                        },
                        {[...]}
                        {[...]}
                        ]
                        }}}}

请问如何遍历出所有字段数据了并可以插入数据库中,我尝试了三个for循环遍历最后都是material[]、pcontent[]里面都是重复插入的值

    for x in data['result']['result']['list']:
        caipu_id = x['id']
        classid_id = x['classid']
        name = x['name']
        peoplenum = x['peoplenum']  # 人数
        preparetime = x['preparetime']  # 做菜时间
        content = x['content']  # 简介
        pic = x['pic']  # 背景图
        tag = x['tag']
        for a in x['material']:
            mname_null.append(a['mname'])
            amount_null.append(a['amount'])
            # mname_null.clear()   #清空list
        for (q,d) in zip(mname_null,amount_null):
            data_null.append(q)
            data_null.append(d)
        for i in x['process']:
            material_null.append(i['pcontent'])
            pic_null.append(i['pic'])
        for (g, k) in zip(material_null, pic_null):
            process_null.append(g)
            process_null.append(k)
阅读 4k
2 个回答
# -*- coding: utf-8 -*-
from pprint import pprint
import json

test_json = json.loads("""{
"problems": [{
    "Diabetes":[{
        "medications":[{
            "medicationsClasses":[{
                "className":[{
                    "associatedDrug":[{
                        "name":"asprin",
                        "dose":"",
                        "strength":"500 mg"
                    }]
                }]
            }]
        }],
        "labs":[{
            "missing_field": "missing_value"
        }]
    }],
    "Asthma":[{}]
}]}""")

fields_dict = {}


def recur_from_dict(dict_json):
    for key in dict_json:
        if type(value := dict_json.get(key)) not in (dict, list):
            fields_dict[key] = value
            # insert data into db here
        elif type(value) == dict:
            recur_from_dict(value)
        elif type(value) == list:
            for item in value:
                if type(item) == dict:
                    recur_from_dict(item)


recur_from_dict(dict_json=test_json)
pprint(fields_dict)

一个简单的递归,不过只能获取 key:value 格式的数据,对于 key: [value1, value2, value3]格式这种没有处理。

新手上路,请多包涵

感谢你的回答,我的写法也能获取到key:value格式数据,用我的那种方法获取key: [value1, value2, value3]格式就会出现重复递增了
我在其他地方找到这个实现方式,循环插入sJOSN.append(i[-1])列表中就变成一个大列表了,这样就变成如何从列表中取出相应的值:菜谱名称、菜谱简介、菜谱标签、菜谱所需食材、菜谱步骤

这print输出的列表值
['10000', False, 0, '查询成功', 0, 'ok', 2673, 1, 336, 223, '香干芹菜炒肉丝', '1-2人', '10-20分钟', '10-20分钟', '这是一道很经典,简单易做的家常菜,我不知道是不是湘菜,呵呵。记得以前在学校时,每次去小店吃饭,我们同学都喜欢点这道菜,现在我在家经常做这个菜,很好吃哦', 'http://api.jisuapi.com/recipe/upload/20160719/115246_13477.jpg', '家常菜,瘦身,排毒,高血压,原味,炒,简单,泡椒,解酒,便秘,冬季,降血压,解暑,夏至,下火,肉菜,美白,减肥,去火,清火,全菜系,1-2人,清热解暑,肥胖,清热下火,祛痘,脂肪肝,炒锅,1小时-2小时,祛痘美白,阳盛质', '清水', 0, '少许', '色拉油', 0, '适量', '鸡精', 0, '适量', '蚝油', 0, '适量', '干淀粉', 0, '适量', '食用盐', 0, '适量', '泡椒', 0, '适量', '姜', 0, '适量', '香干', 1, '200g', '芹菜', 1, '50g', '瘦肉', 1, '300g', '瘦肉切丝,加干淀粉、蚝油及少许清水拌匀稍稍腌一会儿;芹菜切寸断;香干切长条;姜切成末;泡椒切开(切碎、切片、切条都行哈)。', 'http://api.jisuapi.com/recipe/upload/20160719/170301_52132.jpg', '炒锅倒油,开小火,下肉丝,用筷子将其扒拉散,至肉丝变色后将其捞出控油。', 'http://api.jisuapi.com/recipe/upload/20160719/170301_87497.jpg', '锅内留底油,下姜末及泡椒末炒香。', 'http://api.jisuapi.com/recipe/upload/20160719/170301_68785.jpg', '下香干翻炒。', 'http://api.jisuapi.com/recipe/upload/20160719/170301_57850.jpg', '加少许盐炒约1分钟后下芹菜,大火爆炒约半分钟。', 'http://api.jisuapi.com/recipe/upload/20160719/170301_21651.jpg', '再将丝肉下锅,加盐、鸡精调味,半分钟即可。', 'http://api.jisuapi.com/recipe/upload/20160719/170302_22928.jpg']

def dict_generator(indict, pre=None):
    pre = pre[:] if pre else []
    if isinstance(indict, dict):
        for key, value in indict.items():
            if isinstance(value, dict):
                if len(value) == 0:
                    yield pre+[key, '{}']
                else:
                    for d in dict_generator(value, pre + [key]):
                        yield d
            elif isinstance(value, list):
                if len(value) == 0:
                    yield pre+[key, '[]']
                else:
                    for v in value:
                        for d in dict_generator(v, pre + [key]):
                            yield d
            elif isinstance(value, tuple):
                if len(value) == 0:
                    yield pre+[key, '()']
                else:
                    for v in value:
                        for d in dict_generator(v, pre + [key]):
                            yield d
            else:
                yield pre + [key, value]
    else:
        yield indict
if __name__ == "__main__":
    sJOSN =  []
    sValue = json.loads(date)
    for i in dict_generator(sValue):
        sJOSN.append(i[-1])
    print(sJOSN)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题