2011-03-31 31 views
15

मैं के रूप मेंका उपयोग करते हुए भाव

list(i for i in range(100) if i*i < 30) 

सूची comprehensions/जनरेटर भाव में if और for उपयोग कर सकते हैं मैं जानता हूँ कि यह सबसे कारगर नहीं है, लेकिन मेरे साथ सहन के रूप में हालत भी बहुत कुछ हो सकता है जटिल और यह सिर्फ एक उदाहरण है। हालांकि, यह अभी भी सौ पुनरावृत्तियों के माध्यम से चला जाता है और केवल पहले 6. में एक मूल्य पैदावार वहाँ एक रास्ता है, जहां कुछ इस तरह से बंद करने के लिए जनरेटर अभिव्यक्ति बताने के लिए है:

list(i for i in range(100) while i*i < 30) 

हालांकि, while जनरेटर में समझ नहीं है भाव। तो, मेरा सवाल यह है कि, मैं एक स्टॉपिंग स्थिति के साथ जनरेटर अभिव्यक्ति कैसे लिखूं ताकि यह गणना जारी न रखे, भले ही यह नए मान न उत्पन्न करे।

+1

बस एक नोट: आप '[i for i in range (100)] ' – Joril

+0

का उपयोग कर सीधे एक सूची उत्पन्न कर सकते हैं उत्सुकता से, [PEP3142] (https://www.python.org/dev/peps/ पेप -3142 /) इस सवाल से पूछा गया था। दिए गए उपयोग मामले लगभग एक ही है। Guido ने मई, 2013 में –

उत्तर

9

itertools (takewhile() में दिमाग में आता है) में विभिन्न कार्य मदद कर सकते हैं।

20

क्योंकि takewhile() और dropwhile() की वाक्य रचना स्पष्ट नहीं है, यहाँ अपने प्रश्न का वास्तविक उदाहरण हैं:

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))] 
[0, 1, 2, 3, 4, 5] 
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))] 
[6, 7, 8, 9] 

यह जान लें कि itertools has questioned के लेखक इन कार्यों का बहिष्कार करना है या नहीं।

+0

इन कार्यों को बहिष्कृत करने के मामले में नुस्खा क्या होगा? – highBandWidth

+0

बस [itertools.takewhile] के लिए पाइथन दस्तावेज़ देखें (http://docs.python.org/library/itertools.html#itertools.takewhile) और [itertools.dropwhile] (http://docs.python.org /library/itertools.html#itertools.dropwhile)। प्रत्येक में सीधे पायथन समकक्ष होता है। – dawg

+6

सिर्फ 'सूची नहीं है (itertools.takewhile (लैम्ब्डा x: x * x <30, रेंज (10))) – wim

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