2012-07-12 32 views
12

Potrebbe essere una domanda classica in Python, ma non ho ancora trovato la risposta.Come posso convertire un elenco di dizionari in un dizionario di liste in Python?

Ho una lista di dizionari, questi dizionari hanno chiavi simili. Ecco come si presenta:

[{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>}] 

vorrei ottenere un nuovo dizionario con [0,3,6,9] come tasti, e gli elenchi dei "myech.MatchingResponse" come valori.

Naturalmente posso farlo utilizzando un ciclo semplice ma mi chiedevo se esiste una soluzione più efficiente.

+0

Per l'inverso (da dict-di-liste da elencare-of-dicts) vedere: https://stackoverflow.com/q/1780174/1959808 –

+0

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

risposta

18
import collections 

result = collections.defaultdict(list) 

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

Questo è molto lento! – salomonvh

2

diciamo che l'elenco è assegnato a una variabile chiamata 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

usa 'dict.setdefault' o' collections.defaultdict' invece di questo! : D – jamylak

+0

thx, darò un'occhiata a quello. Mai usato setdefault. – bigblind

+0

Anche questo non funzionerà poiché l'iterazione attraverso un dizionario esegue iterazioni attraverso le sue chiavi, quindi questo, 'per chiave, valore in dic', genererà un errore. cambia in 'per chiave, valore in dic.items()'. Modifica: l'ho appena modificato per te – jamylak

1

E 'possibile farlo con dict comprensione così ... potrebbe essere una sola riga, ma ho mantenuto come due linee per chiarezza. :)

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} 

risultati in:

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

questo non è quello che il richiedente è dopo –

+0

@OttoAllmendinger Ah .. ho frainteso il problema ... per favore dai un'occhiata alla soluzione corretta :) –

+0

Non sono sicuro delle prestazioni ma ora è una risposta valida –

Problemi correlati