2010-11-10 12 views
33

Questo codice Python può essere abbreviato e può essere ancora letto con itertools e set?Creare o aggiungere a un elenco in un dizionario - può essere abbreviato?

result = {} 
for widget_type, app in widgets: 
    if widget_type not in result: 
     result[widget_type] = [] 
    result[widget_type].append(app) 

posso pensare a questo solo:

widget_types = zip(*widgets)[0] 
dict([k, [v for w, v in widgets if w == k]) for k in set(widget_types)]) 

risposta

34

È possibile utilizzare un defaultdict(list).

from collections import defaultdict 

result = defaultdict(list) 
for widget_type, app in widgets: 
    result[widget_type].append(app) 
+0

mai saputo di questo. Freddo! –

66

Un'alternativa a defaultdict è quello di utilizzare il metodo setdefault dei dizionari standard:

result = {} 
for widget_type, app in widgets: 
    result.setdefault(widget_type, []).append(app) 

Questo si basa sul fatto che le liste sono mutabili, così quello che viene restituito dal setDefault è la medesima lista di quello uno nel dizionario, quindi è possibile aggiungere ad esso.

+1

E questo è il mio nugget Python da imparare per la giornata. Grazie, Daniel. :) – Walter

4

può essere un po 'lento ma funziona

result = {} 
for widget_type, app in widgets: 
    result[widget_type] = result.get(widget_type, []) + [app] 
+0

perché questo sarebbe più lento rispetto alle altre soluzioni? –

Problemi correlati