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]
但这似乎是乱码,我也做了两次数学。有没有更好、更优雅的方法来做到这一点?这两种解决方案似乎都有些笨重。谢谢
解决方案
你原来的方法真的没有错。我非常喜欢它而不是两次调用函数的方法,这似乎绝对是浪费的,特别是如果它做了很多工作。
如果您使用 >=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]
推荐阅读
- android - Fragment BackStack 生命周期问题
- linux - Ghostscript:如何包含它曾经包含的 Apple ImageWriter 驱动程序?
- google-apps-script - 使用 Google Sheets Apps 脚本创建发送数据的日志选项卡
- javascript - 尝试制作矩形是否有什么问题?
- nginx - 使用 ngx.ctx 在 Openresty/Lua 中的块之间传递变量
- html - 如何使图像垂直溢出div?
- python - 如何在保持宽度相同的同时强制子图的纵横比?
- angular - 在 app.module.ts 中导入类的简单方法
- verilog - System Verilog DPI Checker 屏蔽 128 位值
- python - 以菱形填充的numpy数组