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

时间:2012-09-17 16:24:05

标签: python generator

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

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

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

2 个答案:

答案 0 :(得分:8)

from itertools import dropwhile

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

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

答案 1 :(得分:5)

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

或作为1-liner(我更喜欢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)