2012-07-11 19 views
11

मैंने देखा कि आज सुबह एक स्क्रिप्ट लिखते समय मुझे कुछ उम्मीद नहीं थी। मैंने एक सूची समझ का उपयोग करने की कोशिश की और इसे सभी को एक बयान में सॉर्ट किया और एक आश्चर्यजनक परिणाम मिला। निम्नलिखित कोड को सारांशित मेरी सामान्य उपयोग के मामले, लेकिन इस प्रश्न के लिए सरल है:एक वक्तव्य में एक सूची समझ छंटाई

Transaction = namedtuple('Transaction', ['code', 'type']) 

my_list = [Transaction('code1', 'AAAAA'), Transaction('code2', 'BBBBB'), Transaction('code3', 'AAAAA')] 

types = ['AAAAA', 'CCCCC'] 

result = [trans for trans in my_list if trans.type in types].sort(key = lambda x: x.code) 

print result 

आउटपुट:

None 

अगर मैं समझ का उपयोग कर सूची बनाते हैं, तो यह इस तथ्य के बाद सॉर्ट, सब कुछ है ठीक। मुझे उत्सुकता है कि ऐसा क्यों होता है?

+2

'sort' तरीकों * यथा-स्थान सूची * सॉर्ट करता है और फिर रिटर्न' None'। – sloth

उत्तर

21

विधि list.sort() जगह में सूची छँटाई है, और सभी परिवर्तनशील तरीकों के रूप में यह None देता है। एक नई क्रमबद्ध सूची लौटने के लिए अंतर्निहित फ़ंक्शन sorted() का उपयोग करें।

result = sorted((trans for trans in my_list if trans.type in types), 
       key=lambda x: x.code) 

के बजाय lambda x: x.code, आप भी थोड़ा तेज operator.attrgetter("code") इस्तेमाल कर सकते हैं।

0

आप sorted बिल्टिन फ़ंक्शन चाहते हैं। sort विधि जगह में एक सूची टाइप करता है और None देता है।

result = sorted([trans for trans in my_list if trans.type in types],key = lambda x: x.code) 
इस

थोड़ा द्वारा बेहतर किया जा सकता है:

import operator 
result = sorted((trans for trans in my_list if trans.type in types), key=operator.attrgetter("code")) 
+0

ध्यान दें कि सूचीबद्ध प्रतिलिपि को 'क्रमबद्ध()' के परिणामस्वरूप सूची की एक प्रति में परिणाम प्राप्त करना है। यह जरूरी नहीं है, लेकिन परिणामस्वरूप उच्च स्मृति खपत हो सकती है। –

+0

आपको जनरेटर अभिव्यक्ति को कोष्ठक में संलग्न करने की आवश्यकता है। –

+0

@SvenMarnach - आपको ब्रांड्स की आवश्यकता नहीं है? 'सॉर्ट किया गया (एक्स एक्सेंज में एक्स के लिए x (10))' मेरे लिए बस ठीक काम करता है – mgilson

2

एक सूची पर .sort कॉलिंग रिटर्न None। यह सही समझ में आता है कि इस परिणाम को result पर असाइन किया गया है।

दूसरे शब्दों में, यदि आप एक सूची समझ के साथ अनाम सूची बनाते हैं, तो .sort कहते हैं, और जबकि .sort कॉल का परिणाम result चर में संग्रहीत किया जाता सूची खो दिया है।

के रूप में अन्य लोगों ने कहा, आप एक सूची प्रदान करने के लिए sorted() builtin समारोह का उपयोग करना चाहिए। (sorted() सूची का एक क्रमबद्ध प्रतिलिपि देता है।)

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