有没有更优雅的方法可以在列表推导后从列表中删除 Nones

Is there a more elegant way to remove Nones from list after list comprehension

提问人:Ioannis Mourginakis 提问时间:8/17/2020 更新时间:8/17/2020 访问量:344

问:

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

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

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]

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

评论

0赞 Kelly Bundy 8/17/2020
@HarunYilmaz 并且两者都获得了 sample2 的 NameError。

答:

0赞 Allan Juan 8/17/2020 #1

你可以反过来说:

def convertline(x):
    # do some logic
    # do some logic
    # do some logic
    return somecalculatedvalue

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

在我看来,返回的函数有点奇怪。None

评论

0赞 superb rain 8/17/2020
这只是解决了他们“极其简化”的例子。
4赞 juanpa.arrivillaga 8/17/2020 #2

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

如果您使用的是 >=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]