2011-04-29 23 views
8

Hola, soy bastante nuevo en Python, así que no estoy al tanto de todos los pequeños trucos y atajos. Tengo dos matrices multidimensionales:Manera pitónica de unir dos listas de tuplas en una sola lista de dict

>>> colorStrings 
[('0', '2371_9890_020'), ('1', '2371_9031_100'), ('2', '2371_9890_464')] 

y

>>> skus 
[('0', '0017651670'), ('0', '0017651688'), ('0', '0017651696'), ('0', '0017651704'), ('0', '0017651712'), ('0', '0017651720'), ('0', '0017651738'), ('1', '0017650896'), ('1', '0017650904'), ('1', '0017650912'), ('1', '0017650920'), ('1', '0017650938'), ('1', '0017650946'), ('1', '0017650953'), ('2', '0017651746'), ('2', '0017651753'), ('2', '0017651761'), ('2', '0017651779'), ('2', '0017651787'), ('2', '0017651795'), ('2', '0017651803')] 

Básicamente, quiero combinar estos en una matriz de objetos de diccionario. Algo así como:

[ 
{ 
    'colorString': '2371_9890_020' 
    'skus': ('0017651670', '0017651688', '0017651696', '0017651704', '0017651712', '0017651720, '0017651738') 
}, 

{ 
    'colorString': '2371_9031_100' 
    'skus': ('0017650896', '0017650904', '0017650912', '0017650920', '0017650938', '0017650946, '0017650953') 
}, 

{ 
    'colorString': '2371_9890_464' 
    'skus': ('0017651746', '0017651753', '0017651761', '0017651779', '0017651787', '0017651795, '0017651803') 
} 
] 

¿Hay alguna manera Pythonic kewl de hacer esto muy fácilmente usando expresiones Lamba o algún niftiness? ¡Gracias!

+0

Esto es un "join". –

+0

groupby from module itertools también puede ayudar! – shahjapan

+0

Gran pregunta :-) –

Respuesta

10

probar esto:

result = [ 
    { 
     'colorString' : color, 
     'skus' : [value for key, value in skus if key is colorkey] 
    } for colorkey, color in colorStrings 
] 
+0

Oh, eso está bien. Me gusta mucho esta. –

+0

Decidí marcar esto como la respuesta simplemente porque me gusta ... Aunque el método defauldict() funciona muy bien también ... –

+0

Esto es potencialmente bastante ineficiente, ya que tiene que iterar sobre 'colorKey' cada vez para cada entrada en colorStrings – Imran

9

Uso defaultdict al grupo de los SKU por sku_id en primer lugar, a continuación, utilizar una lista por comprensión para generar el conjunto de datos combinados

from collections import defaultdict 

sku_dict = defaultdict(list) 
for color_id, sku in skus: 
    sku_dict[color_id].append(sku) 

combined = [dict(colorString=color, skus=sku_dict.get(color_id)) for color_id, color in colorStrings] 
+1

Bueno, eso funciona perfectamente, ahora para descubrir por qué funciona :) –

-2
dict(d1, **d2) 

Ver esta pregunta relacionada How do I merge dicts together

+0

-1: No hace lo que OP quiere en absoluto – Imran

+0

Ni el fragmento de código ni la pregunta vinculada resuelven el problema de OP. –

+0

Sí, además no lo entiendo, empecé a aprender Python como hace un día. –

Cuestiones relacionadas