简体   繁体   English

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

[英]Recursively accessing paths and values of a nested dictionary

In Python 2.7, how does one dynamically access and print out the keys and values of a nested dictionary? 在Python 2.7中,如何动态访问和打印嵌套字典的键和值? Here's a nonsensical example: https://jsoneditoronline.org/?id=da7a486dc2e24bf8b94add9f04c71b4d 这是一个荒谬的例子: https//jsoneditoronline.org/? id = da7a486dc2e24bf8b94add9f04c71b4d

Normally, I would do something like: 通常情况下,我会这样做:

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

I can hard code it like this and it'll give me desirable results, but how would I access each of the keys and values dynamically so that: 我可以像这样硬编码,它会给我理想的结果,但我如何动态访问每个键和值,以便:

  • The first row just prints the keys ( dict_id , person['person_id'] , person['name'] , family['members']['father'] ) 第一行只打印键( dict_idperson['person_id']person['name']family['members']['father']
  • The second row prints the values respectively (5, 15, "Martin", "Jose") 第二行分别打印值(5,15,“Martin”,“Jose”)

The end result should be in a CSV file. 最终结果应该是CSV文件。

You can use a recursive visitor/generator which returns all the path/value pairs of the leaves: 您可以使用递归访问者/生成器返回叶子的所有路径/值对:

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])

(replace the yield from ... with the appropriate equivalent if using Python < 3.4) (如果使用Python <3.4,则使用适当的等效项替换...的yield from ...

Getting the keys: 获得钥匙:

>>> ','.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'

and the values: 和价值观:

>>> ','.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,[]'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM