एक-पंक्ति सूची की समझ: अगर-और वेरिएंट


178

यह अजगर सूची बोध वाक्यविन्यास के बारे में अधिक है। मुझे एक सूची समझ मिली है जो किसी दी गई श्रेणी की विषम संख्याओं की सूची तैयार करती है:

[x for x in range(1, 10) if x % 2]

यह एक फिल्टर बनाता है - मुझे एक स्रोत सूची मिली है, जहां मैं नंबर भी हटाता हूं ( if x % 2)। मैं कुछ का उपयोग करना चाहूंगा जैसे अगर-तब-यहाँ। निम्नलिखित कोड विफल रहता है:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

अगर वहाँ की तरह एक अजगर अभिव्यक्ति है:

1 if 0 is 0 else 3

सूची समझ के अंदर इसका उपयोग कैसे करें?


1
वाह, यह क्या मूल्य है, आपके पास एक "सूची समझ" है, एक जनरेटर नहीं। अंतिम सिंटैक्स एक ही है सिवाय इसके कि जनरेटर ()इसके बजाय उपयोग करते हैं []
mgilson


2
यह मुझे कुछ समय लिया क्यों प्राप्त करने if x % 2 को हटा भी संख्या (उन्हें रखने के बजाय) - ऐसा इसलिए है क्योंकि जब xभी है x % 2में अभिव्यक्ति परिणाम 0है, जो, बारी में, करने के लिए मूल्यांकन करता Falseहै, जबकि किसी भी intछोड़कर 0करने के लिए मूल्यांकन करता है True

जवाबों:


328

x if y else zप्रत्येक तत्व के लिए आप जिस अभिव्यक्ति के लिए लौट रहे हैं, उसका सिंटैक्स है। इस प्रकार आपको आवश्यकता है:

[ x if x%2 else x*100 for x in range(1, 10) ]

भ्रम इस तथ्य से उत्पन्न होता है कि आप पहले उदाहरण में फ़िल्टर का उपयोग कर रहे हैं , लेकिन दूसरे में नहीं। दूसरे उदाहरण में आप केवल प्रत्येक मान को दूसरे में मैप कर रहे हैं , एक टर्नरी-ऑपरेटर अभिव्यक्ति का उपयोग करते हुए।

एक फिल्टर के साथ, आप की जरूरत है:

[ EXP for x in seq if COND ]

एक फिल्टर के बिना आपको चाहिए:

[ EXP for x in seq ]

और आपके दूसरे उदाहरण में, अभिव्यक्ति एक "जटिल" है, जो एक को शामिल करने के लिए होता है if-else


2
मुझे एक प्रश्न मिला है ... [x for x in range(1, 10) if x % 2]सही वाक्यविन्यास है। [x if x % 2 for x in range(1, 10)]- यह नहीं है, लेकिन [x if x%2 else x*100 for x in range(1, 10)]फिर से है, सही सिंटैक्स। कैसे?
डुकिन

@tkoomzaaskz अपने दूसरे उदाहरण में, यह न तो एक टेर्नरी-इफ-अन्य ऑपरेटर (लापता else) है, और न ही एक फिल्टर (क्योंकि यह EXPसूची समझ के हिस्से पर है )
shx2

3
@tkoomzaaskz आगे स्पष्ट करने के लिए, ध्यान दें कि आप ifअंत में एक दूसरा जोड़ सकते हैं : [x if x%2 else x*100 for x in range(1, 10) if not x%3]पहला ifटर्नरी ऑपरेटर ifका हिस्सा है , दूसरा सूची बोध वाक्यविन्यास का हिस्सा है। संपूर्ण x if x%2 else x*100"समान स्तर पर" एक सरल के रूप में है 2*x, यह बाईं ओर का मूल्यांकन करने के लिए अभिव्यक्ति है for, जब if not x%3पहले से ही फ़िल्टरिंग हुई है।
zx81

नमस्कार, क्या एक लाइन स्टेटमेंट दो लाइनों पर for i in x:और फिर लूप के लिए बनाने की तुलना में अधिक प्रदर्शनकारी होगा if i == y:?
एलेक्सिस। रोलैंड


12

आप सूची की समझ के साथ भी ऐसा कर सकते हैं:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

1
बहुत अच्छा। एक बूलियन टुकड़ा। धन्यवाद, आपने मुझे समाधान पढ़ना आसान बना दिया।

आप ऐसा डबल असाइन भी कर सकते हैं: A, B = [10,11] [a == 19], [1,14] [a == 20]
Stefan Gruenwald

10

बस एक और समाधान, आशा है कि कुछ इसे पसंद कर सकते हैं:

उपयोग करना: [झूठी, सच्ची] [अभिव्यक्ति]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

3

मैं ऐसा करने में सक्षम था

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.