Создать частичный диктат из списка рекурсивно вложенных полей - PullRequest
1 голос
/ 19 марта 2020

После анализа параметра URL для частичных ответов, например, ?fields=name,id,another(name,id),date, я получаю обратно произвольно вложенный список строк, представляющих отдельные ключи вложенного объекта JSON:

['name', 'id', ['another', ['name', 'id']], 'date']

Цель состоит в том, чтобы отобразить этот проанализированный «график» ключей на оригинальный, более крупный диктовку и просто извлечь его частичную копию, например:

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,
}

Софар, я просмотрел вложенных defaultdicts , addict и glom , но сопоставления, которые они принимают поскольку входные данные несовместимы с моим списком (возможно, что-то пропустили), и я получаю мусор.

Как я могу сделать это программно и учесть любое вложение, которое может произойти?

1 Ответ

2 голосов
/ 19 марта 2020

вы можете использовать:

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, который является значением для первого элемента

...