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

发布于 2024-10-30 01:21:22 字数 399 浏览 0 评论 0原文

我可以在列表理解/生成器表达式中使用 iffor 因为

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

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

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

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

I can use if and for in list comprehensions/generator expressions as

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

I know this is not the most efficient but bear with me as the condition could be much more complicated and this is just an example. However, this still goes through hundred iterations and only yields a value in the first 6. Is there a way to tell the generator expression where to stop with something like this:

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

However, while is not understood in generator expressions. So, my question is, how do I write a generator expression with a stopping condition so it does not continue computation, even if it doesn't yield new values.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

会傲 2024-11-06 01:21:22

由于 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 质疑是否弃用这些函数。

Because the syntax of takewhile() and dropwhile() is not the clearest, here are the actual examples of your question:

>>> [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] 

Know that the author of itertools has questioned whether to deprecate these functions.

梦亿 2024-11-06 01:21:22

itertools 中的各种函数 (takewhile() 浮现在脑海中)可以提供帮助。

The various functions in itertools (takewhile() comes to mind) can help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文