2017-09-12 16 views
6

की स्थिति को संतुष्ट नहीं करता है मेरे पास f कार्य करता है जो int लेता है और bool लौटाता है। मैं न्यूनतम गैर-ऋणात्मक पूर्णांक x खोजना चाहता हूं, जिसके लिए f(x)False है। मैं इसे अधिकांश पायथनिक तरीके से कैसे कर सकता हूं (आदर्श एक पंक्ति)? यह, next उपयोग कर रहा हैन्यूनतम गैर-ऋणात्मक पूर्णांक खोजें, जो

x = <perfect one line expression> 
print(x) 
+0

मैं एक विशेषज्ञ क्या pythonic साधन नहीं कर रहा हूँ, लेकिन अपने कोड की तीन पंक्तियां मैं लिखूंगा और इससे संतुष्ट रहूंगा। – VPfB

+0

@VPfB, आखिर में मैं एक-लाइन समाधान के बजाय अपने तीन-लाइन समाधान का उपयोग करता हूं, लेकिन यह जानना दिलचस्प है कि यह एक-पंक्ति में कैसे किया जा सकता है :) – diraria

उत्तर

3

यहाँ:

from itertools import count 
x = next(i for i in count() if not f(i)) 

डेमो

x = 0 
while f(x): 
    x += 1 
print(x) 

मैं की तरह कुछ हैं:


यहाँ कैसे मैं इसे अब क्या है:

>>> def f(x): 
...  return (x - 42)**2 
... 
>>> next(i for i in count() if not f(i)) 
42 
3

itertools.filterfalse और itertools.count साथ ऐसा ही एक कार्यात्मक दृष्टिकोण

from itertools import filterfalse, count 

x = next(filterfalse(f, count())) 

हो सकता है या फिर आप dropwhile, जो जबकि performantly समान अजगर 2 और 3 में एक ही वाक्य रचना का कहना है के साथ filterfalse बाहर स्वैप कर सकते हैं (rici के लिए धन्यवाद)।

from itertools import dropwhile, count 
x = next(dropwhile(f, count())) 
+0

या सार्थक, हालांकि 2.7 संगतता आवश्यक नहीं प्रतीत होती है। – rici

+0

@rici क्यों 'बूंद' के साथ परेशान? मुझे लगता है कि 'itertools.ifilterfalse' और सटीक एक ही दृष्टिकोण ठीक काम करेगा। – miradulo

+1

मेरा मतलब यह नहीं था कि उस बूंद को बेहतर था, लेकिन ऐसा लगता है कि यह भी बदतर नहीं है। यह सिर्फ एक विकल्प है जो पाइथन संस्करणों में एक ही वर्तनी होती है। – rici

1

आप आयात के बिना एक पंक्ति चाहते हैं, तो एक तरह से एक सूची समझ (अजगर 2.7/PyPy) हो सकता है:

def f(x): 
    return True if x == 5 else False 

x = [g(0) for g in [lambda x: x if f(x) else g(x+1)]][0] 

print(x) 
संबंधित मुद्दे