在列表推导或生成器表达式中使用while

21 投票
2 回答
21937 浏览
提问于 2025-04-16 14:50

我可以在列表推导式和生成器表达式中使用 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 个回答

27

因为 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 的作者曾经 质疑过 是否应该废弃这两个函数。

14

itertools这个库里的各种函数(比如说takewhile())可以提供帮助。

撰写回答