首页 > 解决方案 > 列表理解后是否有更优雅的方法从列表中删除无

问题描述

我正在使用列表推导来映射一个返回值或无的函数。

我的函数看起来像这样(这非常简化,只是为了给你一个大致的想法)

def convertline(x):
    if x == 'undesirablevalue':
        return None
    else:
        # do some logic
        # do some logic
        # do some logic
        return somecalculatedvalue

我让它遍历列表理解中的列表,就像这样。为了过滤掉非字符,我使用列表推导。

items = [convertline(line) for line in sample2.splitlines()]
items = [x for x in items if x is not None]

但是上面的代码看起来很庞大。我意识到我也可以这样做:

items = [convertline(line) for line in sample2.splitlines() if convertline(line) is not None]

但这似乎是乱码,我也做了两次数学。有没有更好、更优雅的方法来做到这一点?这两种解决方案似乎都有些笨重。谢谢

标签: python

解决方案


你原来的方法真的没有错。我非常喜欢它而不是两次调用函数的方法,这似乎绝对是浪费的,特别是如果它做了很多工作。

如果您使用 >=Python3.8,则可以使用赋值表达式:

[result for x in data if (result:= foo(x)) is not None]

或者,以下使用map, 仅执行一次传递并且不构建中间列表:

[x for x in map(foo, data) if x is not None]

推荐阅读