2010-11-10 11 views
33

इस अजगर कोड छोटा किया जा सकता है और अभी भी itertools और सेट का उपयोग कर पढ़ा जा सके?बनाएं या एक शब्दकोश में एक सूची को संलग्न - यह छोटा किया जा सकता?

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

मैं यह केवल के बारे में सोच सकते हैं:

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

उत्तर

34

आप एक defaultdict(list) उपयोग कर सकते हैं।

from collections import defaultdict 

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

कभी इस बात का पता था कि काम करता है हो सकता है। ठंडा! –

66

defaultdict के लिए एक वैकल्पिक मानक शब्दकोशों की setdefault विधि का उपयोग करने के लिए है:

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

इस तथ्य यह है कि सूचियों परिवर्तनशील हैं पर निर्भर करता है, तो क्या SetDefault से दिया जाता है के रूप में ही सूची है शब्दकोश में से एक, इसलिए आप इसमें शामिल हो सकते हैं।

+1

और वह दिन के लिए सीखने के लिए मेरा पायथन गूंज है। धन्यवाद, डैनियल। :) – Walter

4

थोड़ा धीमा हो सकता है लेकिन

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

यह अन्य समाधानों की तुलना में धीमा क्यों होगा? –

संबंधित मुद्दे