递归访问嵌套字典的路径和值

发布于 2021-01-29 16:13:37

在Python
2.7中,如何动态访问并打印出嵌套字典的键和值?这是一个荒谬的示例:https
:
//jsoneditoronline.org/?
id
=da7a486dc2e24bf8b94add9f04c71b4d

通常,我会做类似的事情:

import json

json_sample = 'sample_dict.json'
json_file = open(json_sample, 'r')
json_data = json.load(json_file)

items = json_data['sample_dict']

for item in items:
    dict_id = item['dict_id']
    person = item['person']['person_id']
    family = item['family']['members']

    print dict_id
    print person
    print family

我可以像这样对它进行硬编码,它将为我带来理想的结果,但是我将如何动态地访问每个键和值,从而:

  • 第一行只是打印键(dict_idperson['person_id']person['name']family['members']['father']
  • 第二行分别打印值(5、15,“ Martin”,“ Jose”)

最终结果应该在CSV文件中。

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用递归的访问者/生成器,它返回叶子的所有路径/值对:

    def visit_dict(d, path=[]):
        for k, v in d.items():
            if not isinstance(v, dict):
                yield path + [k], v
            else:
                yield from visit_dict(v, path + [k])
    

    (如果使用Python <3.4 ,请yield from ...适当的等效项替换)

    获取密钥:

    >>> ','.join('/'.join(k) for k, v in visit_dict(json_data['sample_dict'][0]))
    'dict_id,person/person_id,person/name,person/age,family/person_id,family/members/father,family/members/mother,family/members/son,family/family_id,items_id,furniture/type,furniture/color,furniture/size,furniture/purchases'
    

    和值:

    >>> ','.join(str(v) for k, v in visit_dict(json_data['sample_dict'][0]))
    '5,15,Martin,18,20,Jose,Maddie,Jerry,2,None,Chair,Brown,Large,[]'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看