voglio generare un dizionario da un elenco di dizionari, raggruppando elementi della lista per il valore di qualche chiave, come ad esempio:Python: voci di elenco di gruppo in un dict
input_list = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
output_dict = {
'pipo': [
{'a': 'pipo', 'b': 'titi'},
{'a': 'pipo', 'b': 'toto'}
],
'tata': [
{'a': 'tata', 'b': 'foo'},
{'a': 'tata', 'b': 'bar'}
]
}
Finora ho trovato due modi per farlo. I primi semplicemente itera sulla lista, creare sottoliste in dict per ogni valore chiave e aggiungere elementi corrispondenti a questi tasti per la sottolista:
l = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
res = {}
for e in l:
res[e['a']] = res.get(e['a'], [])
res[e['a']].append(e)
E un altro utilizzando itertools.groupby
:
import itertools
from operator import itemgetter
l = [
{'a':'tata', 'b': 'foo'},
{'a':'pipo', 'b': 'titi'},
{'a':'pipo', 'b': 'toto'},
{'a':'tata', 'b': 'bar'}
]
l = sorted(l, key=itemgetter('a'))
res = dict((k, list(g)) for k, g in itertools.groupby(l, key=itemgetter('a')))
Mi chiedo quale alternativa è il più efficiente?
Esiste un modo più pitonico/conciso o migliore per ottenere questo risultato?
di "migliore", intendi prestazioni/complessità-saggio? –
(e sì, è corretto che io "voglio raggruppare la mia lista di input in base al valore del tasto 'a' degli elementi della lista" - 'groupby' sembrava essere l'opzione migliore, tuttavia temevo che l'ordinamento obbligatorio prima sarebbe aggiungi complessità non necessaria rispetto a un semplice ciclo 'for') –
" migliore "si riferiva alla complessità, sì. – Bernhard