एक लाइन पर एक if-elif-अन्यथा स्टेटमेंट डालना?


125

मैंने नीचे दिए लिंक को पढ़ा है, लेकिन यह मेरे सवाल का जवाब नहीं देता है।
क्या पायथन में एक टर्नरी सशर्त संचालक है? (सवाल एक पंक्ति में बयान के इतर-संघनित होने के बारे में है)

क्या इफ-इलफ़-इस् त्त कथन को लिखने का एक आसान तरीका है ताकि यह एक पंक्ति में फिट हो?
उदाहरण के लिए,

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

या एक वास्तविक दुनिया उदाहरण:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

मुझे लगता है कि यदि उपरोक्त उदाहरण को निम्नलिखित तरीके से लिखा जा सकता है, तो यह अधिक संक्षिप्त जैसा लग सकता है।

x=2 if i>100 elif i<100 1 else 0 [WRONG]

जवाबों:


185

नहीं, यह संभव नहीं है (कम से कम मनमाने बयानों के साथ नहीं), और न ही यह वांछनीय है। एक लाइन पर सब कुछ फिट करने से संभवतः पीईपी -8 का उल्लंघन होगा जहां यह अनिवार्य है कि लाइनों की लंबाई 80 वर्णों से अधिक नहीं होनी चाहिए।

यह पायथन के ज़ेन के खिलाफ भी है: "पठनीयता मायने रखता है"। ( import thisपूरी बात पढ़ने के लिए पायथन प्रॉम्प्ट पर टाइप करें )।

आप पायथन में एक टर्नरी अभिव्यक्ति का उपयोग कर सकते हैं, लेकिन केवल अभिव्यक्ति के लिए, बयानों के लिए नहीं:

>>> a = "Hello" if foo() else "Goodbye"

संपादित करें:

आपके संशोधित प्रश्न से पता चलता है कि मूल्य निर्दिष्ट किए जाने के अलावा तीन कथन समान हैं। उस स्थिति में, एक जंजीरदार टर्नरी ऑपरेटर काम करता है, लेकिन मुझे अभी भी लगता है कि यह कम पठनीय है:

>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1

दूसरी अभिव्यक्ति 0 क्यों नहीं हुई? i 100 से ऊपर है
AstralWolf

6
@AstralWolf: बहुत-बहुत धन्यवाद! यह पूरी तरह से उस बिंदु को दिखाता है जिसे मैं बनाने की कोशिश कर रहा था - एक जंजीरदार तीखी अभिव्यक्ति संभव है, लेकिन कम पठनीय है, और स्पष्ट रूप से गलतफहमी के लिए आसान है।
टिम पीटरज़

1
यदि आपको इसे और अधिक पठनीय होने की आवश्यकता है, तो आप इसके चारों ओर कोष्ठक लगा सकते हैं, जैसे: a = 1 if i < 100 else (2 if i > 100 else 0)(अनुपचारित, लेकिन मुझे लगता है कि यह काम करना चाहिए)
Zac

@TimPietzcker आप अभिव्यक्ति और कथनों के बीच के अंतर का वर्णन कैसे करेंगे?
एशकेचम

62

यदि आपको अलग-अलग मामलों के लिए केवल अलग-अलग अभिव्यक्तियों की आवश्यकता है तो यह आपके लिए काम कर सकता है:

expr1 if condition1 else expr2 if condition2 else expr

उदाहरण के लिए:

a = "neg" if b<0 else "pos" if b>0 else "zero"

1
"pos"है एक बयान, यह एक अभिव्यक्ति है।
टिम पीत्ज़ेकर

@TimPietzcker धन्यवाद, मैंने पोस्ट को और अधिक सटीक होने के लिए अद्यतन किया।
लाइकहा

20

बस एक और घोंसला अगर दूसरे बयान में खंड। लेकिन ऐसा नहीं है कि यह किसी भी सुंदर लग रही हो।

>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'

1
मेरे लिए, यह स्वीकृत उत्तर की तुलना में बहुत अधिक पठनीय है क्योंकि यह पहले खंड की संरचना और अवधारणा को बनाए रखता है; सिर्फ व्यक्तिपरक मामला।
एजाराट 11

12

कुछ अन्य उत्तरों के बावजूद: क्या यह संभव है :

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

निम्नलिखित एक लाइनर के लिए अनुवाद:

statement1 if expression1 else (statement2 if expression2 else statement3)

वास्तव में आप अनंत तक उन लोगों को घोंसला दे सकते हैं। का आनंद लें ;)


समय कैसे हुआ? मुझे लगता है कि, इन उत्परिवर्ती लूपिंग में अधिक समय लगेगा। इसलिए नेस्टेड छोरों का विकल्प हो सकता है, उपभोग की बेहतर गति के लिए।
प्रेमरानी

हाय @loveR, यह कोई लूप नहीं है, यह सिर्फ एक नेस्टेड है अगर और बयान, और नगण्य समय के लिए
gustavz

7

आप वैकल्पिक रूप getसे एक की विधि का उपयोग कर सकते हैं dict:

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)

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

x = {i<0: -1, i==0: 0, i>0: 1}[True]

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


6

वहाँ एक विकल्प है कि मेरी राय में काफी अपठनीय है, लेकिन मैं वैसे भी एक जिज्ञासा के रूप में साझा करेंगे:

x = (i>100 and 2) or (i<100 and 1) or 0

यहां अधिक जानकारी: https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not


2
यह विहित जावास्क्रिप्ट की तरह दिखता है ;-)
Ant6n

4
if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

यदि आप उपर्युक्त कोड का उपयोग एक पंक्ति में करना चाहते हैं, तो आप निम्न का उपयोग कर सकते हैं:

x = 2 if i > 100 else 1 if i < 100 else 0

ऐसा करने पर, x को 2 को i> 100, 1 को i <100 और 0 को if i = 100 सौंपा जाएगा


3

यह आपके भावों की प्रकृति पर भी निर्भर करता है। "ऐसा नहीं करने" के अन्य उत्तरों पर सामान्य सलाह सामान्य बयानों और सामान्य अभिव्यक्तियों के लिए काफी मान्य है।

लेकिन अगर आपको ज़रूरत है तो एक "प्रेषण" तालिका है, जैसे, दिए गए विकल्प के मूल्य के आधार पर एक अलग फ़ंक्शन को कॉल करना, आप एक शब्दकोश के अंदर कॉल करने के लिए फ़ंक्शन डाल सकते हैं।

कुछ इस तरह:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

एक और के बजाय:

if option=="save":
    save()
...

2

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

x = 2*(i>100) | 1*(i<100)

तुलना सही या गलत होगी, और जब संख्याओं के साथ गुणा किया जाएगा तो या तो 1 या 0. होगा। एक के बजाय एक + का उपयोग कर सकता है। बीच में।


1

त्रिगुट ऑपरेटर एक संक्षिप्त अभिव्यक्ति का सबसे अच्छा तरीका है। वाक्य-विन्यास है variable = value_1 if condition else value_2। इसलिए, अपने उदाहरण के लिए, आपको टर्नरी ऑपरेटर को दो बार आवेदन करना होगा:

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0

0

यदि कथन हो तो आप नेस्टेड टर्नरी का उपयोग कर सकते हैं।

# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)

# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
    age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
    return age_category_name

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