在列表理解或生成器表达式中使用while

时间:2011-03-31 20:27:10

标签: python list-comprehension recipe generator-expression

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

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

我知道这不是最有效率的,但请耐心等待,因为条件可能要复杂得多,这只是一个例子。但是,这仍然经历了一百次迭代,并且只在前六次产生一个值。有没有办法告诉生成器表达式在哪里停止这样的事情:

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

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

2 个答案:

答案 0 :(得分:25)

由于takewhile()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 has questioned的作者是否弃用这些函数。

答案 1 :(得分:14)

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