【问题标题】:Using while in list comprehension or generator expressions在列表推导或生成器表达式中使用 while
【发布时间】:2011-07-27 05:27:32
【问题描述】:

我可以在列表推导/生成器表达式中使用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 for i in range(100)]可以直接生成列表
  • 奇怪的是,在提出这个问题时,PEP3142 是开放的。给出的用例几乎就是这个。 Guido 在 2013 年 5 月对其进行了核爆

标签: python list-comprehension recipe generator-expression


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    因为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是否要弃用这些函数。

    【讨论】:

    • 如果这些功能被弃用,该怎么办?
    • 查看itertools.takewhileitertools.dropwhile 的Python 文档。每个都有直接的 Python 等价物。
    • 不仅仅是list(itertools.takewhile(lambda x: x*x&lt;30, range(10))) 比这里的理解更容易
    • @wim 我将链接指向同一条消息,不同的主机。谢谢
    猜你喜欢
    • 2011-08-14
    • 2017-12-16
    • 2018-08-22
    • 2018-07-29
    • 2019-02-02
    • 2019-09-13
    相关资源
    最近更新 更多