2012-07-12 7 views
12

Puede ser una pregunta clásica en Python, pero aún no encontré la respuesta.¿Cómo convierto una lista de diccionarios a un diccionario de listas en Python?

Tengo una lista de diccionarios, estos diccionarios tienen teclas similares. Se ve así:

[{0: myech.MatchingResponse at 0x10d6f7fd0, 
    3: myech.MatchingResponse at 0x10d9886d0, 
    6: myech.MatchingResponse at 0x10d6f7d90, 
    9: myech.MatchingResponse at 0x10d988ad0}, 
    {0: myech.MatchingResponse at 0x10d6f7b10, 
    3: myech.MatchingResponse at 0x10d6f7f90>}] 

me gustaría obtener un nuevo diccionario con [0,3,6,9] como claves, y las listas de "myech.MatchingResponse" como valores.

Por supuesto que puedo hacer esto utilizando un simple bucle, pero me preguntaba si existe una solución más eficiente.

+0

Para la inversa (desde dict-de-listas para mostrar-of-dicts) ver: https://stackoverflow.com/q/1780174/1959808 –

+0

Relacionado: https://stackoverflow.com/q/30522982/1959808 –

Respuesta

18
import collections 

result = collections.defaultdict(list) 

for d in dictionaries: 
    for k, v in d.items(): 
     result[k].append(v) 
+0

¡Esto es muy lento! – salomonvh

2

digamos que su lista está asignada a una variable llamada mylist.

mydic = {} 
for dic in mylist: 
    for key, value in dic.items(): 
     if key in mydic: 
      mydic[key].append(value) 
     else: 
      mydic[key] = [value] 
+4

¡use 'dict.setdefault' o' collections.defaultdict' en lugar de esto! : D – jamylak

+0

thx, voy a echar un vistazo a eso. Nunca se usó setdefault. – bigblind

+0

Además, esto no funcionará, ya que iterar a través de un diccionario recorre sus claves, por lo que esto, 'for key, value in dic', generará un error. cambie a 'para clave, valor en dic.items()'. Editar: Acabo de cambiarlo por usted – jamylak

1

Es posible hacer esto con la comprensión dict así ... podría ser una línea, pero me he mantenido como dos líneas para mayor claridad. :)

from itertools import chain 

all_keys = set(chain(*[x.keys() for x in dd])) 
print {k : [d[k] for d in dd if k in d] for k in all_keys} 

Resultados en:

{0: ['a', 'x'], 9: ['d'], 3: ['b', 'y'], 6: ['c']} 
+0

esto no es lo que pregunta el asker después de –

+0

@OttoAllmendinger Ah ... No entendí el problema ... por favor, eche un vistazo a la solución corregida :) –

+0

No estoy seguro del rendimiento pero ahora es una respuesta válida –

Cuestiones relacionadas