我有一个生成器,想知道它产生的第一个值大于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
是否有一种蟒蛇般简洁的方式来返回相同的结果?
答案 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)