У меня есть объект Python с несколькими слоями диктов и списков, которые содержат ключи, от которых мне нужно получить значения.Я нашел ответ , использующий рекурсивные генераторы, которые позволят мне получить значение одного ключа, но не нескольких ключей.Вот код:
with open('data.json') as f:
json_data = json.load(f)
def find_key(obj, key):
if isinstance(obj, dict):
yield from iter_dict(obj, key, [])
elif isinstance(obj, list):
yield from iter_list(obj, key, [])
def iter_dict(d, key, indices):
for k, v in d.items():
if k == key:
yield indices + [k], v
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
def iter_list(seq, key, indices):
for k, v in enumerate(seq):
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
for c in find_key(json_data, 'customer_count'):
print(c)
Результат:
(['calendar', 'weeks', 0, 'days', 1, 'availabilities', 0, 'customer_count'], 14)
(['calendar', 'weeks', 0, 'days', 2, 'availabilities', 0, 'customer_count'], 7)
Другой post имеет пример для извлечения нескольких ключей, но не обрабатывает весь объект:
[...]
keys = ("customer_count", "utc_start_at", "non_resource_bookable_capacity")
for k in keys:
keypath, val = next(find_key(json_data, k))
print("{!r}: {!r}".format(k, val))
Результат:
'customer_count': 14
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 18
Как перебрать весь объект и извлечь три ключа, показанные выше?
Мой желаемый результат будет выглядеть примерно так:
'customer_count': 14
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 18
'customer_count': 7
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 25
образец JSON