2011-10-01 13 views
7

मेरे पास एक सूची है और मैं केवल उन प्रविष्टियों पर एक निश्चित फ़ंक्शन का उपयोग करना चाहता हूं जो एक निश्चित स्थिति को पूरा करता है - अन्य प्रविष्टियों को अनमोडिफाइड छोड़ देता है।पायथन सूची समझ - सरल

उदाहरण: कहें कि मैं केवल उन तत्वों से गुणा करना चाहता हूं जो यहां हैं।

a_list = [1, 2, 3, 4, 5] 

वांटेड परिणाम:

a_list => [1, 4, 3, 8, 5] 

लेकिन [elem * 2 for elem in a_list if elem %2 == 0] पैदावार [4, 8] (यह अलावा एक फिल्टर के रूप में काम किया)।

इसके बारे में जाने का सही तरीका क्या है?

उत्तर

18

उपयोग एक conditional expression:

[x * 2 if x % 2 == 0 else x 
for x in a_list] 

(गणित गीक का नोट: आप भी

[x * (2 - x % 2) for x in a_list] 

साथ इस विशेष मामले हल कर सकते हैं, लेकिन मैं पहले विकल्प वैसे भी पसंद करते हैं;)

+0

धन्यवाद, यह बहुत अच्छा काम करता है। इसके अलावा, संपादन के लिए धन्यवाद, मैं अगले प्रारूप का उपयोग करने की कोशिश करूंगा। –

2
a_list = [1, 2, 3, 4, 5] 

print [elem*2 if elem%2==0 else elem for elem in a_list ] 

या, यदि आपके पास एक बहुत लंबी सूची है जिसे आप जगह में संशोधित करना चाहते हैं:

a_list = [1, 2, 3, 4, 5] 

for i,elem in enumerate(a_list): 
    if elem%2==0: 
     a_list[i] = elem*2 

हां, केवल भी तत्व

संशोधित कर रहे हैं
+0

इन-प्लेस प्रतिस्थापन के लिए भी 'a_list [:] = list_comprehension' काम नहीं करना चाहिए? और कि अजगर में लूप होने के बिना? – Voo

+0

@agf तो यह कहीं और नई सूची बनायेगा और उसके बाद तत्वों को अद्यतन करेगा? बहुत बुरा, मैंने सोचा कि सूची की समझ की सीमाओं के कारण हम गारंटी दे सकते हैं कि एक तत्व को केवल ओवरराइट करने से पहले ही संदर्भित किया जा सकता है ताकि इसे अनुकूलित किया जा सके। – Voo

+0

@Voo इन-प्लेस असाइनमेंट किसी भी पुनरावर्तनीय से काम करता है, इसलिए आप इसे जनरेटर अभिव्यक्ति से कर सकते हैं। मैंने अभी कोशिश की है, और वास्तव में काम करने लगता है भले ही आप 'उल्टा (a_list)' या जनरेटर का उपयोग करते हैं जो सूची की लंबाई से कम आइटम उत्पन्न करता है। ऐसा कुछ नहीं है जिसे मैंने पहले करने का सोचा है; विचार लाने के लिए धन्यवाद :)। – agf

0

आप इस्तेमाल कर सकते हैं लैम्ब्डा:

>>> a_list = [1, 2, 3, 4, 5] 
>>> f = lambda x: x%2 and x or x*2 
>>> a_list = [f(i) for i in a_list] 
>>> a_list 
[1, 4, 3, 8, 5] 

संपादित - agf की टिप्पणी के बारे में सोच रही थी मैं अपने कोड का एक 2 संस्करण बनाया:

>>> a_list = [1, 2, 3, 4, 5] 
>>> f = lambda x: x if x%2 else x*2 
>>> a_list = [f(i) for i in a_list] 
>>> a_list 
[1, 4, 3, 8, 5] 
+0

साझा करने का उपयोग न करें 'हालत और true_value या त्रिगुट आपरेशन का अनुकरण करने false_value'; पायथन में वास्तव में एक संस्करण है। इसके अलावा, वहाँ एक लैम्ब्डा में यह किसी भी तरह से रैप करने के लिए कोई जरूरत नहीं है, क्योंकि यह एक अभिव्यक्ति एक बयान में यह सूची समझ में ठीक काम करता है सही के बजाय है। 'लैम्ब्डा की एक ही सीमा है, इसलिए सूची समझ या जनरेटर अभिव्यक्ति में किसी के लिए _never_ की आवश्यकता है। – agf

+0

@agf - मुझे समझ में (और के साथ सहमत) लैम्ब्डा के बारे में अपनी टिप्पणी, लेकिन इस मामले में यह मेरे लिए एक वैकल्पिक तरीका लगता है (हालांकि अब तक बिल्कुल सही से दूर) सूची समझ से चयन वस्तुओं के तर्क विभिन्न स्तरों पर डाल करने के लिए । और पाइथन टर्नरी ऑपरेटर के बारे में शेष के लिए धन्यवाद। मैंने इसे प्रतिबिंबित करने के लिए दूसरा संस्करण बनाया है। –

+0

'लैम्ब्डा एक्स:' और 'च()' [i के लिए में a_list] 12 अक्षर, '' है 18 है - तो आप अभिव्यक्ति होने से इनलाइन बजाय के लिए एक 'lambda' में यह स्पष्ट है और तेजी से कर रहे हैं केवल एक और समारोह के बजाय यदि आपके पास पूरी तरह से अलग सूची समझ है तो केवल छह और वर्ण। – agf