Рекурсивный доступ к путям и значениям вложенного словаря - PullRequest
0 голосов
/ 27 апреля 2018

В 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_id, person['person_id'], person['name'], family['members']['father'])
  • Во второй строке выводятся значения соответственно (5, 15, «Мартин», «Хосе»)

Конечный результат должен быть в файле CSV.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать рекурсивный посетитель / генератор, который возвращает все пары путь / значение листьев:

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

(замените yield from ... на соответствующий эквивалент при использовании Python <3.4) </p>

Получение ключей:

>>> ','.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,[]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...