计算第一个大于X的发电机结果的优雅方法

And*_*den 2 python generator

我有一个生成器,并想知道它生成的第一个值大于X.一种方法是这样做,但它似乎相当冗长(它读起来像重复自己).

def long_winded(gen,X)
    n = next(gen)
    while n < X: n=next(gen)
    return n
Run Code Online (Sandbox Code Playgroud)

我想写的更简单:

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
Run Code Online (Sandbox Code Playgroud)

是否有一种蟒蛇般简洁的方式来返回相同的结果?

Amb*_*ber 8

from itertools import dropwhile

def first_result_larger_than_x(gen, X):
    return next(dropwhile(lambda n: n <= X, gen))
Run Code Online (Sandbox Code Playgroud)

请注意,OP中的代码示例实际上返回的第一个结果大于或等于 X.我在此代码示例中已经更正了,但如果这是您真正想要的,请将<=其更改为a <.


mgi*_*son 5

def short2(gen,X):
    for x in gen:
        if x > X: 
            return x
Run Code Online (Sandbox Code Playgroud)

或者作为1-liner(我更喜欢itertools变体):

def short3(gen,X):
    return next(x for x in gen if x > X)
Run Code Online (Sandbox Code Playgroud)

我的原始答案 - 只为后代而留下

我不一定断言这个方法更好,但你可以使用递归函数:

def short(gen,X):
    n = next(gen)
    return n if n>X else short(gen,X)
Run Code Online (Sandbox Code Playgroud)

  • 这是优雅的,但如果您要使用生成器,您必须检查超过一千个元素(或者超过您设置的最大递归限制),这是一个坏主意. (3认同)
  • @mgilson:不,我想我其实更喜欢你的,但我不能否认我的第一直觉是"dropwhile". (2认同)