2010-11-10 11 views
33

¿Se puede acortar este código de Python y seguir siendo legible utilizando itertools y conjuntos?Crear o anexar a una lista en un diccionario: ¿puede acortarse?

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

se me ocurre esto sólo:

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

Respuesta

34

Se puede utilizar un defaultdict(list).

from collections import defaultdict 

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

nunca supo de esto. ¡Guay! –

66

Una alternativa a defaultdict es utilizar el método setdefault de diccionarios estándar:

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

Esto se basa en el hecho de que las listas son mutables, así que lo que se devuelve desde setdefault es la misma lista que la uno en el diccionario, por lo tanto puede agregarlo.

+1

Y esa es mi pepita de Python para aprender por el día. Gracias, Daniel. :) – Walter

4

puede ser un poco lento, pero funciona

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

¿por qué sería esto más lento que las otras soluciones? –

Cuestiones relacionadas