如何用列表推导式简洁生成输出文件名列表,避免重复调用os.path.splitext
这个场景完全适合用列表推导式实现,且可以避免重复调用os.path.splitext,有两种常用实现方案:
方案1:全Python版本兼容写法
利用单元素元组的迭代完成一次性赋值,只会调用一次os.path.splitext,性能和原生for循环完全一致:
import os names = [f"{base}_env{ext}" for file in f_list for base, ext in (os.path.splitext(file),)]
原理是末尾的for base, ext in (os.path.splitext(file),)只会迭代一次(因为元组只有一个元素),相当于在推导式内部完成了变量解包赋值,没有额外开销。
方案2:Python 3.8+ 可选写法
如果运行环境支持Python 3.8及以上版本,也可以用海象运算符先缓存os.path.splitext的返回值:
import os names = [f"{split_res[0]}_env{split_res[1]}" for file in f_list if (split_res := os.path.splitext(file))]
这里的if判断仅用来完成赋值操作,os.path.splitext永远不会返回空值,所以不会过滤任何元素。
补充说明
如果团队对代码可读性要求很高,你原来的显式for循环也是非常合理的实现,不需要刻意追求列表推导式的写法,两种写法的运行效率没有本质差异。
内容的提问来源于stack exchange,提问作者Josiah Lund
相关产品推荐
相关产品推荐

