2010-11-19 12 views
7

क्या यह सूची समझ के बिना एक पंक्ति में लिखा जा सकता है?के लिए यदि एक पंक्ति में सूची समझ के बिना

for x in vec: 
    if x > 3: 
     ... 
     ... 
+10

क्यों नहीं?/क्यों 1 लाइन? – kennytm

+0

मैं उनके साथ बहुत परिचित नहीं हूं, लेकिन क्या 'लैम्ब्डा' कथन यहां उचित होगा? – Blender

+0

@ ब्लेंडर: अकेले 'लैम्ब्डा' बकवास होगा। 'I-/filter' के लिए पूर्वानुमान के रूप में, हां। – delnan

उत्तर

3

नहीं, आप नहीं कर सकता। Python language reference कहता है: '। खंड' '। सूट'

यौगिक बयान एक या अधिक के खंड एक विशेष यौगिक बयान के हेडर मिलकर एक खंड एक शीर्षक और एक के होते हैं एक ही सब पर हैं इंडेंटेशन स्तर। प्रत्येक खंड शीर्षलेख एक विशिष्ट पहचान कीवर्ड और एक कोलन के साथ समाप्त होता है। एक सूट द्वारा नियंत्रित बयान का एक समूह है जो एक खंड है। एक सुइट में एक या अधिक अर्धविराम द्वारा अलग किए सरल बयान हेडर के रूप में एक ही लाइन पर , हेडर की पेट के निम्नलिखित हो सकता है, या यह बाद तर्ज पर एक या अधिक दांतेदार बयान हो सकता है। केवल बाद वाले सूट के रूप में नेस्टेड यौगिक बयान शामिल हो सकते हैं; निम्नलिखित, गैर कानूनी है ज्यादातर क्योंकि यह स्पष्ट जो करने के लिए खंड अगर एक निम्नलिखित बाकी खंड से संबंधित हैं नहीं होगा:

if test1: if test2: print x 

दरअसल, अजगर ऊपर नेस्टेड आईएफएस के लिए एक SyntaxError उत्पन्न करता है।

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

suite   ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT 

stmt_list  ::= simple_stmt (";" simple_stmt)* [";"] 

ध्यान दें कि जब for एक खरोज के बिना एक बयान के बाद आता है, कि बयान एक stmt_list है, जो केवल simple_stmt उदाहरणों की अनुमति देता है होना चाहिए: अधिक औपचारिक रूप से for के बारे में, इस अजगर में अपने व्याकरण है। simple_stmt यह है:

simple_stmt ::= expression_stmt 
       | assert_stmt 
       | assignment_stmt 
       | augmented_assignment_stmt 
       | pass_stmt 
       | del_stmt 
       | print_stmt 
       | return_stmt 
       | yield_stmt 
       | raise_stmt 
       | break_stmt 
       | continue_stmt 
       | import_stmt 
       | global_stmt 
       | exec_stmt 

कौन सा if और for तरह यौगिक बयान शामिल नहीं है।


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

+1

मुझे नहीं लगता कि वह पूछ रहा था कि क्या वह उन 2 कथनों को एक पंक्ति पर रख सकता है। मुझे लगता है कि वह सिर्फ एक पंक्ति पर होने वाले उन 2 कथनों का समग्र प्रभाव चाहता है। – Gerrat

+0

@Eli: चूंकि उसने उदाहरण में एलिप्सिस की दो पंक्तियां डाली हैं, इसलिए वह 'x' के साथ कुछ प्रक्रियात्मक कर रहा है, सूची सूची को अस्वीकार्य समाधान समझता है। ** सूची की समझ किसी भी लूप को एक ऑनलाइनर ** में बदलने का कोई तरीका नहीं है। – delnan

+0

@ डेलनान: आप सही हो सकते हैं, मुझे वास्तव में पता नहीं है। क्या ओपी-इरादा-व्याख्या एक मजेदार एसओ गेम नहीं है? :-) मैं रॉबर्टो को यह स्पष्ट करने के लिए प्रोत्साहित करता हूं कि वह वास्तव में क्या चाहता है –

-1

आप इस तरह somethings कल्पना कर सकते हैं:

def do_something(value): 
    ... 

def do_otherthing(value): 
    ... 


for x in t: do_something(x) if x>3 else do_otherthing(x) 
+0

वही है जो उसने नहीं पूछा: "सूची समझ के बिना" –

+1

कृपया प्रश्न फिर से पढ़ें। –

+0

प्रश्न विशेष रूप से इसके लिए नहीं पूछता है - संभवतः क्योंकि '...' कई कथन हैं, इस मामले में एक सूची समझ गैर-मूर्खतापूर्ण होगी। – delnan

0

यह कर सकते हैं, लेकिन सूची comprehensions/जनरेटर भाव कि यहां इस्तेमाल किया जाना चाहिए बात का सही तरह कर रहे हैं। आप अपने if ब्लॉक में जो करना चाहते हैं उसके आधार पर, आप map या reduce के कुछ रूपों का उपयोग कर सकते हैं, लेकिन सूची समझने और जनरेटर अभिव्यक्तियों को संभवतः करने का सबसे अच्छा तरीका है।

+0

मुझे if के बाद कई पंक्तियां लिखने की आवश्यकता है, इसलिए यह – Roberto

+0

@ रॉबर्टो उड़ान भरने वाला नहीं है, इसलिए एक फ़ंक्शन लिखें जो आपको चाहिए और सूची समझ में उपयोग करें –

+0

तो मैं हटा दूं के लिए एक लाइन/अगर हर बार मुझे ऐसा कुछ करना है, लेकिन मैं फ़ंक्शन घोषित करने के लिए एक पंक्ति जोड़ता हूं :) – Roberto

0

हाँ

फिल्टर में एक्स के लिए

(लैम्ब्डा मैं: i> 3, vec):

+0

ध्यान दें कि पायथन 2 में, यह मूल्यों को आलसी रूप से उत्पन्न करने के बजाय तुरंत एक नई सूची तैयार करेगा। – delnan

+0

http://docs.python.org/library/itertools.html#itertools.ifilter –

3

देखें @KennyTM ... इतना संपीड़ित करने के लिए कोई कारण नहीं है।

क्या कहा जा रहा है, for x in (i in vec if i > 3) काम है, साथ ही itertools.ifilter करता है (या बस builtin filter अजगर 3 में) एक lambda x: x > 3 विधेय के साथ। वे सभी पुनरावृत्तियों के साथ भी काम करते हैं, और आलसी हैं (उदाहरण के लिए यदि आप लूप के दौरान break, तो आपने एक आइटम को बहुत अधिक चेक नहीं किया है)।

+0

ओपी के रूप में एक टिप्पणी में कहा गया है कि पूरे बिंदु, "if * x * एक बड़ा शब्द है, मुझे इसे टाइप करना होगा दो बार "(बालों को खींचने वाला पल), तो संभवत: एक 'फिल्टर' + 'लैम्ब्डा' इस के लिए उपयुक्त उत्तर है ... प्रश्न। – tzot

संबंधित मुद्दे