Перенос списка в сложный иерархический словарь - PullRequest
1 голос
/ 30 марта 2020

Всем, привет,

У меня есть задача перевести список типа random_list=['2018-01-01', 'google', 'cpc', 100] (который можно расширить вручную) в словарь, например {'2018-01-01': {'google': {'cpc': 100}}}, который также можно расширить больше, если список расширен.

Например, если бы я добавил в список любую строку или целое число - оно должно быть включено в словарь и иметь вид {'2018-01-01': {'google': {'cpc': {100: 'example'}}}} или {'2018-01-01': {'google': {'cpc': {'example': 100}}}}.

Я много путешествовал на этом веб-сайте переполнения стека, и есть такие вопросы, но ничто по сравнению с «включенным словарем». Я здесь новый пользователь, и, возможно, в будущем мои навыки поиска здесь будут улучшены, но я не могу найти ничего подобного. Я могу превратить его в простые словари, но ничто по сравнению с этим.

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Это можно сделать с помощью рекурсии, используя первую запись в списке в качестве ключа к значению, являющемуся вложенным словарем, созданным из остальной части списка:

def make_dict(l):
    if len(l) < 2:
        return None
    elif len(l) == 2:
        return { l[0] : l[1] }
    else: 
        return { l[0] : make_dict(l[1:]) }

print(make_dict(['2018-01-01', 'google', 'cpc', 100]))
print(make_dict(['2018-01-01', 'google', 'cpc', 100, 'example']))

Вывод:

{'2018-01-01': {'google': {'cpc': 100}}}
{'2018-01-01': {'google': {'cpc': {100: 'example'}}}}
1 голос
/ 30 марта 2020

Вы также можете построить его, используя functools.reduce :

from functools import reduce

random_list=['2018-01-01', 'google', 'cpc', 100]

reduce(lambda v, k: {k:v}, reversed(random_list[:-1]), random_list[-1])
# {'2018-01-01': {'google': {'cpc': 100}}}

Мы начнем с начального значения random_list[-1] (100), которое будет передано в качестве значения при запуске итерация назад по остальной части списка. На первой итерации создается dict {'cpc': 100}. На каждой следующей итерации уже построенный dict передается в качестве значения для построения следующего уровня dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...