2012-07-18 19 views
6

Digamos que tengo una lista de los diccionarios de este modo:¿Cómo puedo combinar diccionarios con las mismas claves en python?

dict[0] is 
{'key_a': valuex1, 
'key_b': valuex2, 
'key_c': valuex3} 

dict[1] is 
{'key_a': valuey1, 
'key_b': valuey2, 
'key_c': valuey3} 

dict[2] is 
{'key_a': valuez1, 
'key_b': valuez2, 
'key_c': valuez3} 

me gustaría tomar estas y construir un gran diccionario de este modo:

big_dict: 
{'key_a': [valuex1, valuey1, valuez1], 
'key_b': [valuex2, valuey2, valuez2], 
'key_c': [valuex3, valuey3, valuez3]} 

¿Hay alguna elegante "zip" -como forma en que puedo hacer esto?

Todas las teclas siempre serán idénticas.

Siempre puedo repetir las teclas en cada una y construir un nuevo diccionario de listas, pero parece muy poco parecido a un pitón.

Respuesta

11
big_dict = {} 
for k in dicts[0]: 
    big_dict[k] = [d[k] for d in dicts] 

(Retitulé su dict-dicts desde dict es un built-in, y predice tiene más sentido.)

O, con una comprensión dict:

{ k:[d[k] for d in dicts] for k in dicts[0] } 

o, por Python 2.7 <:

dict((k, [d[k] for d in dicts]) for k in dicts[0]) 
+0

Impresionante. Aprendí algo nuevo con la comprensión. ¡Gracias! – hide0

3

Si todos los dicts tienen el sam e juego de llaves, esto va a funcionar:

dict((k, [d[k] for d in dictList]) for k in dictList[0]) 

Si ellos pueden tener diferentes teclas, usted tendrá que construyó un juego de llaves al hacer uniones establecidas en las teclas de las distintas predice:

allKeys = reduce(operator.or_, (set(d.keys()) for d in dictList), set()) 

Entonces usted necesita para proteger contra las teclas que faltan en algunos predice:

dict((k, [d[k] for d in [a, b] if k in d]) for k in allKeys) 
+3

Puede usar una comprensión de diccionario: '{k: [d [k] para d en dictList [para k en dictList [0]}' – Blender

+0

Sí, si usa una versión de Python que admita la comprensión de diccionarios. Estoy usando 2.6 yo mismo, así que no tengo eso. – BrenBarn

+0

una comprensión dict es sintácticamente sinónima de una expresión de generador donde '{key: value ...}' se reemplaza por 'dict ((key, value) ...)', que incluso es válido en 2.6 –

0

puede combinar los diccionarios de la siguiente manera:

def merge_dicts(dict_list, separator=''): 
    """ 
    Merges list of dictionaries to a single dictionary, Concatenates values with the same key. 
    :param dict_list: list of dictionaries to be merged. 
    :param separator: separator to be inserted between values of same key. 
    :return: Merged dictionary. 
    """ 
    return {k1: separator.join([d[k1] for d in dict_list if k1 in d]) 
      for k1 in set(reduce(lambda x, y: x+y, [k.keys() for k in dict_list])) 
    } 
Cuestiones relacionadas