我有一个生成器,并想知道它生成的第一个值大于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)
是否有一种蟒蛇般简洁的方式来返回相同的结果?
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 <.
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)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |