提问人:Ioannis Mourginakis 提问时间:8/17/2020 更新时间:8/17/2020 访问量:344
有没有更优雅的方法可以在列表推导后从列表中删除 Nones
Is there a more elegant way to remove Nones from list after list comprehension
问:
我正在使用列表推导来映射一个返回值或 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赞
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]
评论