2017-09-12 70 views
6

我有功能f需要int並返回bool。我想找到最小的非負整數x,其中f(x)False。我怎樣才能以最pythonic的方式(理想情況下一行)?找到最小的非負整數,其不滿足條件


這裏是我如何做到這一點現在:

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

我想是這樣的:

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

我不是什麼專家Python的手段,但你三行代碼是我會寫和會滿意的。 – VPfB

+0

@ VPfB,最後我用我的三行解決方案而不是單行解決方案,但有趣的是知道如何在單行中完成它:) – diraria

回答

3

這是使用next

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

演示:

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

itertools.filterfalseitertools.count類似功能的方法可能是

from itertools import filterfalse, count 

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

或者你可以用dropwhile,這同時performantly類似的跨Python 2和3保持相同的語法換出filterfalse感謝rici)。

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

或者儘管2.7兼容性似乎並不必要。 – rici

+0

@rici爲什麼要用'dropwhile'?我認爲'itertools.ifilterfalse'和完全相同的方法可以正常工作。 – miradulo

+1

我並不是故意暗示這個下降會更好,但是在我看來,這並不是更糟。這只是在兩個Python版本中碰巧具有相同拼寫的替代方案。 – rici

1

如果您想不進口單行線,一條路可能是一個列表理解(Python的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)