【问题标题】:Efficiently filtering out 'None' items in a list comprehension in which a function is called在调用函数的列表理解中有效地过滤掉“无”项
【发布时间】:2018-07-14 13:27:32
【问题描述】:

我有一个列表解析,它调用一个可能返回 None 的函数。

>>> f = lambda x: x if x < 3 else None
>>> l = [f(x) for x in [1,2,3,4]]
[1, 2, None, None]

我想要上面的列表理解,没有“无”条目。

在不产生额外开销并保持列表理解效率的同时,执行以下操作的更有效方法是什么?

>>> filter(None, [f(x) for x in [1,2,3,4]])
[1, 2]

【问题讨论】:

  • [i for i in [1,2,3,4] if i&lt;3]是不是一定要用f函数?
  • @vaultah 抱歉。需要明确的是,我对 Python 2.7 解决方案很感兴趣。已编辑。
  • @AlbinPaul - 是的,调用 f(x) 是必要的。

标签: python python-2.7 list list-comprehension


【解决方案1】:

在您的理解中添加if,例如:

l = [y for y in (f(x) for x in [1,2,3,4]) if y is not None]

通过在列表推导中放置Generator Expression,您只需要对函数求值一次。此外,生成器表达式是一个生成器,因此不需要额外的中间存储。

Python 3.8+

从 Python 3.8 开始,您可以使用 Assignment Expression (:=)(AKA:命名表达式或海象运算符)来避免对 f() 进行多次评估,例如:

l = [y for x in [1,2,3,4] if (y := f(x)) is not None]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2020-01-16
    • 2022-11-22
    相关资源
    最近更新 更多