如何在列表推导式中合并分割与映射,避免重复调用split()?
优化后的Python惯用写法
你可以用两种符合Python风格的方式合并操作,避免重复调用split():
方法一:使用海象运算符(Python 3.8+)
海象运算符:=能在表达式内部完成赋值并判断,一行里同时处理分割和非空校验:
out_vals = [ {"date": parts[0], "time": parts[1], "size": parts[2], "name": parts[3]} for line in res.stdout.split("\n") if (parts := line.split()) ]
这里parts := line.split()会先把每行分割后的结果赋值给parts,同时判断这个结果是否非空(空行split后得到空列表,布尔值为False,会被过滤),之后直接用parts生成字典,无需重复分割。
方法二:兼容旧版本Python的嵌套推导
如果需要兼容Python 3.7及更早版本,可以用嵌套的列表推导,通过临时变量保存分割结果:
out_vals = [ {"date": parts[0], "time": parts[1], "size": parts[2], "name": parts[3]} for line in res.stdout.split("\n") for parts in [line.split()] if parts ]
这里for parts in [line.split()]相当于把每行分割后的结果赋值给parts,后续直接使用,同样避免了重复调用split(),同时通过if parts过滤空行。
两种写法都把分割和映射操作整合到了同一个列表推导中,符合Python“简洁、可读”的惯用风格,且无需额外的中间变量存储分割后的行列表。
内容的提问来源于stack exchange,提问作者Layman
相关产品推荐
相关产品推荐

