Создать вложенный словарь из списка python
Напишите код для преобразования списка из целых чисел произвольной длины во словарь, вложенность которого зависит от длины списка.
Например, если перед вами был бы такой список
[100, 55, 77, 55, 89]
то он должен превратится в такой словарь
{100: {55: {77: {55: 89}}}}
На вход программе поступают числа для списка в одну строку, гарантируется, что в списке будет как минимум два элемента.
Ваша задача вывести полученный словарь
Вот мое решение, но оно верно только для списка из трех значений. Как сделать из произвольного количества значений???
sp = input().split()
num_list = [int(i) for i in sp]
result_dict = {}
result_dict = {num_list[-2]: num_list[-1]}
for i in range(len(num_list)-2):
d = {num_list[i]: result_dict}
print(d)
Ответы (3 шт):
Предисловие
Ваша задача - это небольшая модернизация типовой задачи о вложенном словаре.
В исходном виде она выглядит следующим образом - из такого списка:
[100, 55, 77, 55, 89]
Сделать вот такой словарь:
{100: {55: {77: {55: {89: {}}}}}}
И эта задача решена уже множество раз, например, здесь.
Приведу пример ее решения:
a = [100, 55, 77, 55, 89]
tree_dict = {}
for key in reversed(a):
tree_dict = {key: tree_dict}
print(tree_dict)
Вывод:
{100: {55: {77: {55: {89: {}}}}}}
Вернемся к вашей задаче
Отличие лишь в том, что последний элемент списка должен быть помещен не в качестве вложенного словаря, а в качестве значения.
Сделать это можно многими способами, например, перед основным алгоритмом "заготовить" нужный нам хвост словаря:
a = [100, 55, 77, 55, 89]
tree_dict = a[-1]
for key in reversed(a[:-1]):
tree_dict = {key: tree_dict}
print(tree_dict)
Тогда уже получаем нужный нам вывод:
{100: {55: {77: {55: 89}}}}
Создаём итератор, бегущий по списку задом-наперёд. Первое значение итератора - "корень" списка. Остальные значения надеваем на него в цикле:
def make_dict(lst):
it = reversed(lst)
d = next(it)
for n in it:
d = {n: d}
return d
print(make_dict([100, 55, 77, 55, 89]))
$ python make_dict.py {100: {55: {77: {55: 89}}}}
Или рекурсия:
def make_dict(lst):
def rec(i):
if i == len(lst) - 1:
return lst[i]
return {lst[i]: rec(i + 1)}
return rec(0)
Или хвостовая рекурсия:
def make_dict(lst):
def rec(i, d):
if i < 0:
return d
return rec(i - 1, {lst[i]: d})
return rec(len(lst) - 2, lst[-1])
P.S. Во всех вариантах список не копируется. Из-за этого возня с итератором в цикле и индексами в рекурсиях.
Или так:
my_list = ['2018-01-01', 'yandex', 'cpc', 100]
q = 0
b = len(my_list)
dicta ={my_list[b-2] : my_list[b-1]}
while q < b-1:
dicta ={my_list[b-3] : dicta}
q += 1
b -= 1
print(dicta)
результат:
{'2018-01-01': {'yandex': {'cpc': 100}}}