सूची बोध सशर्त में `elif`


129

क्या हम elifसूची समझ में उपयोग कर सकते हैं ?

उदाहरण :

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

for values in l:
    if values==1:
        print 'yes'
    elif values==2:
        print 'no'
    else:
        print 'idle'

क्या हम elifउपरोक्त कोड के समान फैशन सूची में शामिल कर सकते हैं ?

उदाहरण के लिए, एक उत्तर की तरह:

['yes', 'no', 'idle', 'idle', 'idle']

अब तक, मैंने केवल उपयोग किया है ifऔर elseसूची समझ में है।

जवाबों:


250

पायथन की सशर्त अभिव्यक्तियों को इस तरह के उपयोग-केस के लिए बिल्कुल तैयार किया गया था:

>>> l = [1, 2, 3, 4, 5]
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]
['yes', 'no', 'idle', 'idle', 'idle']

उम्मीद है की यह मदद करेगा :-)


5
वाक्य रचना में कुछ दिलचस्प इतिहास है। उनके परिचय से पहले कई वर्षों तक "तृतीयक भाव" भाषा के पाँच सबसे अधिक अनुरोधित परिवर्तनों में से एक थे। चूंकि गुइडो वैन रोसुम ने स्पष्ट रूप से इसे एक बयान-आधारित भाषा के रूप में डिज़ाइन किया था, इसलिए उन्होंने लंबे समय तक (तृतीयक अभिव्यक्तियों और विशेष रूप से उनके दुरुपयोग का दृढ़ता से विरोध किया, कोड में बहुत अस्पष्टता के स्रोत हैं)। जब वह अंत में दम तोड़ दिया, तो उसने घोषणा की कि उसने जानबूझकर एक वाक्यविन्यास चुना है जो अति प्रयोग को हतोत्साहित करता है। हमेशा की तरह, उन्होंने फिर भी एक सुरुचिपूर्ण डिजाइन का काम किया।
होल्डनवेब

1
टेनेरी, डेमिट (उन्होंने लिखा, अपनी डिस्लेक्सिक गलती को संपादित करने में बहुत देर हो गई)।
होल्डनवेब

2
हालांकि मैं इस जवाब को वोट देता हूं, मैं इसका उल्लेख करना चाहता हूं: अगर 1 जोड़ी के लिए / और पढ़ना आसान है, तो 2 जोड़े: इसे समझना मुश्किल हो रहा है। 3 जोड़े का भी उल्लेख न करें। यदि अभिव्यक्ति को 3 या अधिक जोड़े की आवश्यकता है, तो एक शब्दकोश या एक अलग फ़ंक्शन चीजों को पढ़ने और समझने में आसान बना देगा।
हाई वू

1
मैं इस समस्या के लिए समाधान नहीं जोड़ना चाहूंगा, लेकिन स्वच्छ कोड की याद दिलाता हूं: क्योंकि इस सूची की समझ में तीन स्थितियां हैं, इसलिए संभवत: इसे एक अधिक वर्णनात्मक विधि में बदला जा सकता है। मेरी बात यह है: martinfowler.com/bliki/FunctionLength.html :)
अल्वारो

मैं एक मामले में लड़खड़ा गया, जहाँ मुझे एक एलिफ की जरूरत थी, लेकिन केवल दो मूल्यों की। इस उदाहरण का उपयोग करते हुए, मुझे केवल ['yes', 'no']बनाने की आवश्यकता होगी । ऐसा करने के लिए, आप यह कर सकते हैं ['yes' if v == 1 else 'no' for v in l if values in [1,2]]:। मैं वर्तमान में ऐसा करने के लिए एक क्लीनर तरीके के बारे में नहीं सोच सकता।
dTanMan

48
>>> d = {1: 'yes', 2: 'no'}
>>> [d.get(x, 'idle') for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

4
मुझे लगता है कि यह प्रपत्र वास्तव में लंबे और जटिल करने की कोशिश करने की तुलना में पचाने के लिए बहुत आसान है, अगर सूची के भीतर / और तर्क है
जेडी

5
@jdi हालांकि सशर्त-अभिव्यक्तियाँ आपके स्वाद के लिए नहीं हो सकती हैं, वे विशेष रूप से ओपी-अनुरोध के अनुसार, अगर एलिफ-एलिफ -अन्य श्रृंखलाओं को संभालने के लिए डिज़ाइन किए गए थे । वे सीखना मुश्किल नहीं हैं और शालीनता से उन स्थितियों को संभाल सकते हैं जो लुकअप लॉजिक के लिए उत्तरदायी नहीं हैं 'A' if grade>=90 else 'B' if grade>=80 else 'C' if grade>=70 else 'F':।
रेमंड हेटिंगर

1
अगर dसमझ के बाहर परिभाषित करने का कोई फायदा है ?
Chris_Rands

मुझे सूची बोध बेहतर होने का कारण यह है कि यह अंग्रेजी की तरह ही पढ़ता है। एक गैर-प्रोग्रामर भी यह समझने में सक्षम होगा कि यह क्या करता है। इस समाधान के साथ आपको डिक्टेट () विधि को समझना होगा।
टिम स्कोव जैकबसेन

26

आप कर सकते हैं, की तरह।

ध्यान दें कि जब आप sytax का उपयोग करते हैं जैसे:

['yes' if v == 1 else 'no' for v in l]

यदि आप / अन्य ऑपरेटर (यदि आप C जैसी भाषाओं से परिचित हैं, तो यह ?:निर्माण की तरह है :(v == 1 ? 'yes' : 'no') ) का उपयोग कर रहे हैं।

यदि / नहीं तो ऑपरेटर के टर्नरी फॉर्म में एक 'एलिफ' नहीं है, लेकिन आप इसे 'अन्य' स्थिति में अनुकरण कर सकते हैं:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]

यह कहने जैसा है:

for v in l:
    if v == 1 :
        print 'yes'
    else:
        if v == 2:
            print 'no'
        else:
            print 'idle'

तो कोई प्रत्यक्ष 'एलिफ' निर्माण नहीं है, जैसा आपने पूछा था, लेकिन इसे नेस्टेड के साथ सिम्युलेटेड किया जा सकता है, अन्यथा


1
अंतिम पैराग्राफ कोड बहुत ही व्यावहारिक धन्यवाद है!
श्रद्धालु


2

आप सूची का उपयोग कर सकते हैं समझ आप मूल से दूसरी सूची बनाने जा रहे हैं।

>>> l = [1, 2, 3, 4, 5]
>>> result_map = {1: 'yes', 2: 'no'}
>>> [result_map[x] if x in result_map else 'idle' for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

2

एक और आसान तरीका यह है कि सशर्त सूची समझ का उपयोग करें:

l=[1,2,3,4,5]
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l]

आप सही सही देता है:

['हां', 'नहीं', 'बेकार', 'बेकार', 'निष्क्रिय']

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.