【问题标题】:list comprehension equivalent without producing a throwaway list [duplicate]列表理解等效而不产生一次性列表[重复]
【发布时间】:2012-01-31 16:01:17
【问题描述】:

可能重复:
Is it Pythonic to use list comprehensions for just side effects?
proper use of list comprehensions - python

Python 具有有用且优雅的list comprehension 语法。然而 AFAIK 它总是产生一个列表。有时我会因为它的紧凑和优雅而不需要结果列表而感到使用列表推导的冲动:

[some_func(x) for x in some_list if x>5]

some_func() 可能会返回我不需要的东西,它可能根本不会返回任何东西。我尝试了生成器语法:

(some_func(x) for x in some_list if x>5)

但正如您可能猜到的,它不会迭代 some_list。它只在特定的上下文中这样做:

other_func(some_func(x) for x in some_list if x>5)

那么...是否有我缺少的语法来让它工作,或者我应该总是回退到 3 行?

for x in some_list:
    if x>5:
        some_func(x)

【问题讨论】:

  • 这里有一个合理且独特的问题,“如何在不创建一次性列表的情况下运行迭代器完成”。
  • @RaymondHettinger 是对的,我正在为不知道其名称或是否存在的构造寻找替代方案。这与其他两个相关问题完全不同
  • @IgnacioVazquez-Abrams,@delnan - 我还更改了问题的名称以反映这一点

标签: python syntax list-comprehension


【解决方案1】:

如果你觉得它很优雅,我现在不知道,但有一个 consume recipe in the itertools docs 非常快,并且会运行一个迭代器直到完成,而无需建立一个列表:

>>> consume(some_func(x) for x in some_list if x>5)

【讨论】:

  • 我从没想过你可以创建一个长度为零的deque,或者,即使你可以,它对任何事情都有用。
【解决方案2】:

使用genex 获取适当的值以进行迭代。

for i in (x for x in some_list if x > 5):
    some_func(i)

【讨论】:

  • @RaymondHettinger - 我不同意这很糟糕(事实上:+1)。相反,我觉得它非常 Pythonic,因为它同时使用了 for 循环和生成器,以紧凑且不言自明的方式来表达它们的含义......注意澄清你为什么不喜欢它?
【解决方案3】:

如果some_func() 没有返回值(即返回None):

any(some_func(x) for x in some_list if x > 5)

有可能。

否则你可以这样做:

any(some_func(x) and False for x in some_list if x > 5)

或者也许更易读(考虑到与all 的简单英语含义相匹配)是:

all(some_func(x) or True for x in some_list if x > 5)

不过,我喜欢 Raymond 发现的更好的 consume 配方,因为它不会强迫您让生成器返回某个特定值以保证它完全被消耗,并且启动速度会更快。

【讨论】:

    【解决方案4】:

    老实说,在我的代码中,我更喜欢使用三行来表达,但我认为您正在寻找的单行可能是这一行:

    for x in some_list: func(x) if x>5 else None
    

    注意:我尝试使用pass 而不是None,虽然我看起来会更好一些,但这会引发SyntaxError 异常。

    【讨论】:

    • 您只能返回对象(如42None),不能返回语句(如passprintraise)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2016-10-29
    • 2020-07-09
    • 2019-08-13
    相关资源
    最近更新 更多