2

私はジェネレーターを持っていて、それが生成する最初の値が X よりも大きいことを知りたいと考えています。これを行う 1 つの方法は次のとおりですが、かなり長く見えます (それ自体が繰り返されるように読み取れます)。

def long_winded(gen,X)
    n = next(gen)
    while n < X: n=next(gen)
    return n

私が書きたかったのは、もっと単純なことでした:

short_broken(gen,X):
    while next(gen)<X: pass
    return next(gen)            # returns the SECOND value larger than X, as gen is called again
short_broken2(gen,X):
    while n = next(gen)<X: pass # Not python syntax!
    return n

同じ結果を返す簡潔な方法はありますか?

4

2 に答える 2

8
from itertools import dropwhile

def first_result_larger_than_x(gen, X):
    return next(dropwhile(lambda n: n <= X, gen))

OP のコード例は、実際にはX以上<=の最初の結果を返していることに注意してください<

于 2012-09-17T16:26:38.193 に答える
5
def short2(gen,X):
    for x in gen:
        if x > X: 
            return x

またはワンライナーとして(私は itertools バリアントよりも好みます):

def short3(gen,X):
    return next(x for x in gen if x > X)

私の最初の答え - 後世のために残した

この方法が優れていると必ずしも断言しているわけではありませんが、再帰関数を使用できます。

def short(gen,X):
    n = next(gen)
    return n if n>X else short(gen,X)
于 2012-09-17T16:27:02.490 に答える