una - metodos de listas en python
Tres listas comprimidas en una lista de dictados. (4)
Considera lo siguiente:
>>> # list of length n
>>> idx = [''a'', ''b'', ''c'', ''d'']
>>> # list of length n
>>> l_1 = [1, 2, 3, 4]
>>> # list of length n
>>> l_2 = [5, 6, 7, 8]
>>> # first key
>>> key_1 = ''mkt_o''
>>> # second key
>>> key_2 = ''mkt_c''
¿Cómo puedo comprimir este lío para que se vea así?
{
''a'': {''mkt_o'': 1, ''mkt_c'': 5},
''b'': {''mkt_o'': 2, ''mkt_c'': 6},
''c'': {''mkt_o'': 3, ''mkt_c'': 6},
''d'': {''mkt_o'': 4, ''mkt_c'': 7},
...
}
Lo más cercano que tengo es algo como esto:
>>> dict(zip(idx, zip(l_1, l_2)))
{''a'': (1, 5), ''b'': (2, 6), ''c'': (3, 7), ''d'': (4, 8)}
Que por supuesto tiene tuplas como valores en lugar de diccionarios, y
>>> dict(zip((''mkt_o'', ''mkt_c''), (1,2)))
{''mkt_o'': 1, ''mkt_c'': 2}
Lo que parece que podría ser prometedor, pero una vez más, no cumple con los requisitos.
Está trabajando con dictados, listas, índices, claves y le gustaría transponer los datos. Podría tener sentido trabajar con pandas ( DataFrame
, .T
y .to_dict
):
>>> import pandas as pd
>>> idx = [''a'', ''b'', ''c'', ''d'']
>>> l_1 = [1, 2, 3, 4]
>>> l_2 = [5, 6, 7, 8]
>>> key_1 = ''mkt_o''
>>> key_2 = ''mkt_c''
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx)
a b c d
mkt_o 1 2 3 4
mkt_c 5 6 7 8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).T
mkt_o mkt_c
a 1 5
b 2 6
c 3 7
d 4 8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).to_dict()
{''a'': {''mkt_o'': 1, ''mkt_c'': 5},
''b'': {''mkt_o'': 2, ''mkt_c'': 6},
''c'': {''mkt_o'': 3, ''mkt_c'': 7},
''d'': {''mkt_o'': 4, ''mkt_c'': 8}
}
También se puede hacer con dict, zip, mapear y repetir desde itertools:
>>> from itertools import repeat
>>> dict(zip(idx, map(dict, zip(zip(repeat(key_1), l_1), zip(repeat(key_2), l_2)))))
{''a'': {''mkt_c'': 5, ''mkt_o'': 1}, ''c'': {''mkt_c'': 7, ''mkt_o'': 3}, ''b'': {''mkt_c'': 6, ''mkt_o'': 2}, ''d'': {''mkt_c'': 8, ''mkt_o'': 4}}
Solución 1 : Puede usar zip
dos veces (en realidad tres veces) con la comprensión del diccionario para lograr esto como:
idx = [''a'', ''b'', ''c'', ''d'']
l_1 = [1, 2, 3, 4]
l_2 = [5, 6, 7, 8]
keys = [''mkt_o'', ''mkt_c''] # yours keys in another list
new_dict = {k: dict(zip(keys, v)) for k, v in zip(idx, zip(l_1, l_2))}
Solución 2 : También puede usar zip
con la comprensión de listas anidadas como:
new_dict = dict(zip(idx, [{key_1: i, key_2: j} for i, j in zip(l_1, l_2)]))
Solución 3 : usar la comprensión del diccionario en la parte superior de zip
como se comparte en la respuesta de DYZ :
new_dict = {k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}
Todas las soluciones anteriores devolverán new_dict
como:
{
''a'': {''mkt_o'': 1, ''mkt_c'': 5},
''b'': {''mkt_o'': 2, ''mkt_c'': 6},
''c'': {''mkt_o'': 3, ''mkt_c'': 7},
''d'': {''mkt_o'': 4, ''mkt_c'': 8}
}
{k : {key_1 : v1, key_2 : v2} for k,v1,v2 in zip(idx, l_1, l_2)}