`elif`

2012-04-03 16 views
61

क्या हम सूची समझ में elif का उपयोग कर सकते हैं?`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 इस्तेमाल किया है।

उत्तर

132

पायथन के conditional expressions यूज-केस की इस तरह के लिए वास्तव में डिजाइन किए गए थे:

>>> 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'] 

आशा इस मदद करता है :-)

+8

मुझे पसंद है कि कैसे इन श्रृंखला एक साथ – jamylak

+1

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

+1

टर्नरी, बांध (उन्होंने लिखा, संपादित करने के लिए बहुत देर हो चुकी अपनी डिस्लेक्सिक गलती को देखते हुए)। – holdenweb

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

मुझे लगता है कि यह फ़ॉर्म वास्तव में लंबे और जटिल करने की कोशिश करने से पचाने के लिए बहुत आसान है अगर अन्यथा सूची COMP – jdi

+5

@ जेडीआई हालांकि सशर्त-अभिव्यक्ति आपके स्वाद के लिए नहीं हो सकती है, लेकिन * विशेष रूप से ओपी के अनुरोध के रूप में, अगर वे elif-elif-else श्रृंखलाओं को संभालने के लिए डिज़ाइन किए गए थे। उन्हें सीखना मुश्किल नहीं है और जो परिदृश्य लुकअप तर्क के लिए उपयुक्त नहीं हैं, वे अच्छी तरह से उन परिस्थितियों को संभाल सकते हैं: '' 'ए' अगर ग्रेड> = 90 अन्य 'बी' ग्रेड = = 80 अन्य 'सी' ग्रेड => 70 और 'एफ''। –

+0

यदि समझ के बाहर 'डी' को परिभाषित करने का कोई फायदा है? –

1

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

>>> 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'] 
13

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

नोट है कि जब आप की तरह sytax का उपयोग करें:

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

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

की त्रिगुट प्रपत्र अगर/बाकी ऑपरेटर एक 'elif' में बनाया नहीं है, लेकिन आप 'शेष' हालत में यह अनुकरण कर सकते हैं:

['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

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

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

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

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

0

हो सकता है कि आप इस हैं:

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

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l]) 
संबंधित मुद्दे