Эффективный способ создания нескольких словарей в списке

У меня есть dict со следующим форматом

dic = {
          'x':[1, 2, 3, 4], 
          'y':[2, 4, 5, 6], 
          'z':['a', 'b', 'c', 'g'],
          'a':['d', 'e', 'f', 'a'], 
}

Я хочу преобразовать его в формат ниже

lst_wth_dic = [

               {'x':1, 'y':2, 'z': 'a', 'a':'d'}, 
               {'x':2, 'y':4, 'z':'b', 'a':'e'},
               {'x':3, 'y':5, 'z':'c', 'a': 'f'}, 
               {'x':4, 'y':6, 'z':'g', 'a': 'a'}
]

То, что я пробовал до сих пор, это

import copy
lst_wth_dic = []
b = {}
for key, val in dic.items():
     for item in val:
             b[key] = item
     c = copy.copy(b)
     lst_wth_dic.append(c)

Это не дает желаемого результата, который мне нужен.


person YASIR KHAN    schedule 15.04.2020    source источник
comment
Чего он дает? Что такое b? Приведите минимально воспроизводимый пример.   -  person jonrsharpe    schedule 15.04.2020
comment
b тоже дикт   -  person YASIR KHAN    schedule 15.04.2020
comment
Изменить вопрос.   -  person jonrsharpe    schedule 15.04.2020
comment
что следует изменить?   -  person YASIR KHAN    schedule 15.04.2020


Ответы (2)


Вы можете сделать:

d = {
          'x':[1, 2, 3, 4],
          'y':[2, 4, 5, 6],
          'z':['a', 'b', 'c', 'g'],
          'a':['d', 'e', 'f', 'a'],
}

lst_dic = [dict(zip(d.keys(), vs)) for vs in zip(*d.values())]

print(lst_dic)

Вывод

[{'a': 'd', 'x': 1, 'y': 2, 'z': 'a'},
 {'a': 'e', 'x': 2, 'y': 4, 'z': 'b'},
 {'a': 'f', 'x': 3, 'y': 5, 'z': 'c'},
 {'a': 'a', 'x': 4, 'y': 6, 'z': 'g'}]

Выражение:

zip(*d.values())

создает следующую итерацию:

[(1, 2, 'a', 'd'), (2, 4, 'b', 'e'), (3, 5, 'c', 'f'), (4, 6, 'g', 'a')]

затем для каждого из этих кортежей zip его с ключами d. Приведенное выше понимание списка эквивалентно следующему циклу for:

lst_dic = []
for vs in zip(*d.values()):
    lst_dic.append(dict(zip(d.keys(), vs)))
person Dani Mesejo    schedule 15.04.2020

Вы можете выполнять понимание dict в понимании списка:

   lst_wth_dic = [{k:v[i] for k, v in dic.items()} for i in range(4)]
person Billy    schedule 15.04.2020