在列表理解之后,有没有更优雅的方法从列表中删除Nones

2024-09-30 16:40:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用列表理解来映射一个要么返回值要么不返回值的函数

我的函数看起来是这样的(这是非常简单的,只是给你一个大概的想法)

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]

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


Tags: 函数innone列表forreturnifline
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]

你可以用另一种方式:

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的函数有点奇怪

相关问题 更多 >