2

我有一个生成器,想找出它生成的第一个值大于 X。一种方法如下,但它似乎相当冗长(它读起来就像它在重复自己)。

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

或作为 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)
于 2012-09-17T16:27:02.490 回答