20

我可以在列表推导/生成器表达式中使用ifand作为for

list(i for i in range(100) if i*i < 30)

我知道这不是最有效的,但请耐心等待,因为情况可能要复杂得多,这只是一个例子。但是,这仍然要经过一百次迭代,并且只在前 6 次中产生一个值。有没有办法告诉生成器表达式在哪里停止,如下所示:

list(i for i in range(100) while i*i < 30)

但是,while在生成器表达式中无法理解。所以,我的问题是,我如何编写一个带有停止条件的生成器表达式,这样它就不会继续计算,即使它不会产生新值。

4

2 回答 2

26

因为takewhile()and的语法dropwhile()不是最清晰的,所以这里是您问题的实际示例:

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))]
[0, 1, 2, 3, 4, 5]
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))]
[6, 7, 8, 9] 

要知道,itertools 的作者曾质疑是否要弃用这些功能。

于 2011-08-30T04:57:51.767 回答
14

itertoolstakewhile()想到)中的各种功能可以提供帮助。

于 2011-03-31T20:29:25.860 回答