2012-10-20 5 views
19

में सशर्त है क्या पाइथन के पास कुछ ऐसा है?पाइथन

for item in items #where item>3: 
    #..... 

मेरा मतलब है पायथन 2.7 और पायथन 3.3 दोनों एक साथ।

उत्तर

37

आप एक generator expression साथ पाश गठजोड़ कर सकते हैं:

for x in (y for y in items if y > 10): 
    .... 

itertools.ifilter एक और विकल्प है - और दक्षता के मामले में भी बेहतर एक, उदाहरण के लिए एक बड़े डेटासेट पर।

+4

ऐसा करने का यह सही तरीका है क्योंकि कोई इंटरमीडिएट सरणी नहीं बनाई जाती है। इसे जनरेटर अभिव्यक्ति कहा जाता है। आईएमओ इसकी दयालुता है, यदि आप x> 10: 'यद्यपि आइटम में एक्स के लिए छोटे 'लिख सकते हैं। –

+0

@ माइकल एंडरसन: हाँ, यह साफ होगा।कहा जाता है कि यह वाक्यविन्यास गुइडो ने खारिज कर दिया है, मुझे हालांकि सबूत नहीं मिला है। – georg

7

आप कुछ इस तरह का मतलब: -

item_list = [item for item in items if item > 3] 

या, आप Generator अभिव्यक्ति, कि एक नई सूची बनाने नहीं होगा उपयोग कर सकते हैं, बल्कि एक जनरेटर है, जो तब yield का उपयोग कर प्रत्येक यात्रा पर अगले तत्व रिटर्न देता है विधि: -

for item in (item for item in items if item > 3): 
    # Do your task 
+0

@Downvoter .. क्यों डाउनवोट? क्या डाउनवॉटर टिप्पणी कर सकते हैं? –

+0

यह गलत है .. –

+0

@ जेएफ। सेबेस्टियन आह क्षमा करें, इसके बाद 'if' होना चाहिए। –

2

वहाँ अपने प्रश्न में where की तरह एक विशेष सिंटैक्स नहीं है, लेकिन आप हमेशा सिर्फ एक if बयान अपने for पाश के भीतर, जैसे आप किसी अन्य भाषा में होगा इस्तेमाल कर सकते हैं:

for item in items: 
    if item > 3: 
     # Your logic here 

या एक गार्ड खंड (फिर से, किसी भी अन्य भाषा की तरह):

for item in items: 
    if not (item > 3): continue 

    # Your logic here 
इन उबाऊ दृष्टिकोण के

दोनों लगभग के रूप में संक्षिप्त और पठनीय के रूप में इस के लिए एक विशेष वाक्य रचना हो जाएगा।

+0

जेनरेटर अभिव्यक्ति के साथ शीर्ष-रेटेड समाधान अधिक कार्यात्मक है और यह इंगित करता है कि अभिव्यक्ति की रेखा पर सूची में क्या है। – Neil

+0

@Neil मुझे नहीं लगता कि यह एक डाउनवोट जरूरी है। चाहे "अधिक कार्यात्मक" एक अच्छी बात है स्वाद का सवाल है। यह दृष्टिकोण कोड की एक अतिरिक्त पंक्ति का उपयोग करता है, जो कुछ मामलों में वर्बोज़ लग सकता है; एक लाइन जनरेटर प्रारंभिक अनुक्रम और भविष्यवाणी अभिव्यक्ति के लिए अभिव्यक्ति को एक पंक्ति पर क्रैम करता है (और इसके अलावा 'एक्स' के लिए अतिरिक्त 'पेश करता है) जो अनुक्रम अभिव्यक्ति और अनुमानित अभिव्यक्ति के लिए एक पंक्ति पर बहुत अधिक क्रैम करने का प्रयास कर रहा है लंबा। जनरेटर दृष्टिकोण एक भाषा सुविधा का भी उपयोग करता है जो नए शौक से परिचित नहीं हो सकता है। जो सबसे अच्छा है संदर्भ और दर्शकों पर निर्भर करता है। –

2

आप एक स्पष्ट if बयान इस्तेमाल कर सकते हैं:

for item in items: 
    if item > 3: 
     # ... 

या आप एक जनरेटर बना सकते हैं अगर आप एक नाम की आवश्यकता बाद में दोहराना चाहते, example:

filtered_items = (n for n in items if n > 3) 

या आप यह एक करने के लिए दे सकते हैं समारोह:

total = sum(n for n in items if n > 3) 

यह स्वाद का विषय हो सकता है लेकिन मैं f उपरोक्त विकल्पों की तुलना में बदसूरत होने के लिए for x in (y for y in items if y > 3): जैसे रेखांकित जीनएक्सप्र के साथ संयुक्त एक फॉर-लूप।

0

अजगर 3 और अजगर 2.7 दोनों filter() समारोह जो जो एक समारोह के लिए (नीचे उदाहरण में, कि लैम्ब्डा समारोह है) एक सूची से बाहर आइटम निकालने की अनुमति देता है True देता है:

>>> nums=[1,2,3,4,5,6,7,8] 
>>> for item in filter(lambda x: x>5,nums): 
...  print(item) 
... 
6 
7 
8 

समारोह छोड़ना filter() में होगा True में केवल 0 आइटमों को निकालें, जैसा कि pydoc filter