Создать частичный dict из рекурсивно вложенного списка полей
После анализа параметра URL для частичных ответов, например?fields=name,id,another(name,id),date
, Я получаю произвольно вложенный список строк, представляющих отдельные ключи вложенного объекта JSON:
['name', 'id', ['another', ['name', 'id']], 'date']
Цель состоит в том, чтобы отобразить этот проанализированный "граф" ключей на исходный, более крупный dict и просто получить его частичную копию, например:
input_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42",
"but_wait": "there is more!"
},
"even_more": {
"nesting": {
"why": "not?"
}
},
"date": 1584567297
}
следует просто:
output_dict = {
"name": "foobar",
"id": "1",
"another": {
"name": "spam",
"id": "42"
},
"date": 1584567297,
}
Sofar, я просмотрел вложенные defaultdicts, addict и glom, но сопоставления, которые они принимают в качестве входных данных, несовместимы с моим списком (конечно, возможно, я что-то пропустил), и я получаю мусор.
Как я могу сделать это программно и учесть возможное вложение?
1 ответ
Вы можете использовать:
def rec(d, f):
result = {}
for i in f:
if isinstance(i, list):
result[i[0]] = rec(d[i[0]], i[1])
else:
result[i] = d[i]
return result
f = ['name', 'id', ['another', ['name', 'id']], 'date']
rec(input_dict, f)
выход:
{'name': 'foobar',
'id': '1',
'another': {'name': 'spam', 'id': '42'},
'date': 1584567297}
здесь предполагается, что во вложенном списке первый элемент является действительным ключом верхнего уровня, а второй элемент содержит действительные ключи из вложенного dict, который является значением для первого элемента