vaciar una tuplas palabra metodos llenar listas lista funciones buscar anidadas python dictionary zip mapping

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)}