如何简化单行迭代循环写法?避免重复调用join(path, name)
问题解答
首先,你的示例代码确实会两次计算路径——每次循环中,join(path, name)会分别在if条件判断和列表元素生成时各执行一次,生成两次完全相同的路径字符串。
下面是几种避免重复编写join(path, name)的简化方案:
方案1:嵌套生成器表达式(最推荐)
通过生成器表达式预先生成完整路径,再在列表推导中过滤,每个路径仅计算一次:
import os from os.path import exists, join path = r"C:\Test_folder\\" name_list = ["image01.png", "image02.png", "image03.png"] result = [full_path for full_path in (join(path, name) for name in name_list) if exists(full_path)]
这里的(join(path, name) for name in name_list)是一个惰性生成器,它会逐个输出完整路径,后续的存在性判断和列表元素添加都会复用这个预先生成的路径值,避免重复计算。
方案2:使用map+filter结合lambda(可实现,但可读性稍弱)
你提到的lambda确实可以实现需求:先用map将文件名映射为完整路径,再用filter结合lambda过滤存在的文件:
result = list(filter(lambda full_path: exists(full_path), map(lambda name: join(path, name), name_list)))
不过这种写法嵌套了两层lambda,相比生成器表达式,可读性较差,Python社区更推荐优先使用推导式而非复杂的lambda嵌套。
额外补充:复杂场景可选itertools.starmap
如果后续路径拼接逻辑变得复杂,还可以用itertools.starmap固定path参数,但对于当前简单场景来说属于过度设计:
from itertools import starmap result = [full_path for full_path in starmap(join, [(path, name) for name in name_list]) if exists(full_path)]
内容的提问来源于stack exchange,提问作者Bogdan
相关产品推荐
相关产品推荐

