2017-09-12 5 views
6

fintとなり、戻り値はboolです。私は、最小非負整数xを探したいとします。f(x)Falseです。どのように私はほとんどのpythonic方法で(理想的には1行)それを行うことができますか?ここで条件を満たさない負でない最小の整数を見つけよう


は、私は今それを行う方法です。

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

私が何かしたい:

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

私がニシキヘビ何を意味専門家ではないんだけど、あなたのコードの3行は、私が書いたものであり、満足できるものです。 – VPfB

+0

@VPfB、最後に私は3行のソリューションを1行のソリューションの代わりに使用しますが、それは1行でどのように実行できるかを知ることは面白いです:) – 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())) 

かもしれないそれとも、(performantly同様のは、Python 2と3で同じ構文を維持しながらdropwhilefilterfalseをスワップアウトすることができ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

使用すると、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) 
関連する問題