Tengo tres listas y tres claves para cada lista, y me gustaría convertirlas en una lista de diccionarios.

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [5.0, 6.0, 7.0]
keys = ['key1', 'key2', 'key3']

Mi salida esperada es esta,

[[{'key1': 1, 'key2': 'a', 'key3': 5.0}], 
 [{'key1': 2, 'key2': 'b', 'key3': 6.0}], 
 [{'key1': 3, 'key2': 'c', 'key3': 7.0}]]

¿Cuál es la forma más pitónica de lograr esta producción?

2
at0736 9 jun. 2021 a las 02:39

3 respuestas

La mejor respuesta

Tratar:

list1 = [1, 2, 3]
list2 = ["a", "b", "c"]
list3 = [5.0, 6.0, 7.0]
keys = ["key1", "key2", "key3"]

out = []
for t in zip(list1, list2, list3):
    out.append([dict(zip(keys, t))])

print(out)

Huellas:

[[{'key1': 1, 'key2': 'a', 'key3': 5.0}], 
 [{'key1': 2, 'key2': 'b', 'key3': 6.0}], 
 [{'key1': 3, 'key2': 'c', 'key3': 7.0}]]

O:

out = [[dict(zip(keys, t))] for t in zip(list1, list2, list3)]
print(out)
4
Andrej Kesely 8 jun. 2021 a las 23:42
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [5.0, 6.0, 7.0]
keys = ['key1', 'key2', 'key3']
lists = [list1, list2, list3]


result = []

for list in lists: 
    d = {}
    for i, j in zip(keys, list):
        d[i] = j
    result.append([d])

print(result)
0
Dharman 9 jun. 2021 a las 00:06

En esta solución, la idea es reducir todo el problema a solo un diccionario de la siguiente manera: {key: array_to_assign}

from functools import reduce
from collections import OrderedDict

list_response = [] 
list_dicts = []
list_values = [list1, list2, list3]

for index, k in enumerate(keys):
    list_dicts.append(
          OrderedDict({k: list_values[index]})
    )
my_dictionary = reduce(lambda d1, d2: OrderedDict(list(d1.items()) + list(d2.items())) , list_dicts)

Finalmente, le itamos el diccionario y asignemos el artículo de la lista anidada a la tecla correcta.

for key, value in my_dictionary.items():
    for i in value:
        list_response.append({
            key: i
        })
print(list_response)

Salida:

[
   {'key1': 1}, 
   {'key1': 2}, 
   {'key1': 3}, 
   {'key2': 'a'}, 
   {'key2': 'b'}, 
   {'key2': 'c'}, 
   {'key3': 5.0}, 
   {'key3': 6.0}, 
   {'key3': 7.0}
]
0
CarMoreno 9 jun. 2021 a las 01:20