Итерация Python и создание вложенного словаря

#python #python-3.x #dictionary #iteration

Вопрос:

У меня есть некоторые данные в приведенном ниже формате (mylist), и я пытаюсь преобразовать их во вложенный словарь, но изо всех сил пытаюсь получить правильный формат. Я перепробовал несколько вариантов итераций и преобразований, но не смог получить желаемого результата. Могу ли я получить некоторую помощь в получении данных в нужном формате, как показано в желаемом результате, используя формат данных в mylist?

 mylist = [
    [('floor', 'first_floor'), ('bed_room', 'room1'), ('windows', 2), ('color', 'violet')],
    [('floor', 'second_floor'), ('bed_room', 'room2'), ('windows', 4), ('color', 'violet')],
]

nest_keys = ['floor', 'bedroom']
cmd_tree = {}
for i in mylist:
    last_element = True
    for key in reversed(nest_keys):
        if last_element is True:
            cmd_tree = {key: dict([x for x in i if x[0] not in nest_keys])}
            last_element = False
        else:
            cmd_tree = {key: cmd_tree}

print(cmd_tree)
 

Текущий Результат:

 {'floor': {'bedroom': {'bed_room': 'room2', 'windows': 4, 'color': 'violet'}}}
 

желаемый результат:

 {'floor': {'first_floor': {'bed_room': {'room1': {'color': 'white',
                                                  'windows': 2}}},
           'second_floor': {'bed_room': {'room2': {'color': 'violet',
                                                   'windows': 4}}}}}
 

Комментарии:

1. 'windows' находится перед 'color' входом mylist , вы уверены, что хотите получить его после 'color' ввода желаемого результата ?

Ответ №1:

Нет необходимости повторять цикл в обратном порядке, просматривайте список, и каждая начальная итерация представляет собой этаж, затем просматривайте его содержимое, чтобы создать детали этажей:

 result = {}
br = 'bed_room'

for (_, floor_name), *details in mylist:
    result[floor_name] = {br: {}}
    
    for name, detail in details:
        if name == br:
            room = detail
            result[floor_name][br][room] = {}
        else:
            result[floor_name][br][room][name] = detail

print({'floor': result})
 

 {'floor': {'first_floor': {'bed_room': {'room1': {'color': 'violet',
                                                  'windows': 2}}},
           'second_floor': {'bed_room': {'room2': {'color': 'violet',
                                                   'windows': 4}}}}}
 

Комментарии:

1. большое вам спасибо за ответ. Могу ли я спросить, что делают » _ » и * — детали в цикле for?

2. Это называется распаковкой заданий. См.: PEP 3132 для получения более подробной информации

3. Если это ответ на ваш вопрос, пожалуйста, не стесняйтесь пометить его как таковой!

4. Я встаю KeyError: 2 в очередь : result[floor_name][br][detail][name] = detail . Вы уверены, что это работает ?

5. @Soroushbakh исправил мою ошибку в уборке. Я редактировал.