列表理解与多个命令

List comprehension with multiple commands

我正在为文件列表创建输出文件。在我的例程结束时,我想获得一个输出文件名列表,我可以使用下面的 for 块来实现。有没有一种干净的方法可以使用列表理解来做这样的事情,或者现在不是理解的好时机?

import os

names = []
for file in f_list:
    base, ext = os.path.splitext(file)
    names.append(f"{base}_env{ext}")

下面的代码有效,但如果我无法摆脱 os.path.splitext 的重复调用,我对此并不感到兴奋。

[f"{os.path.splitext(file)[0]}_env{os.path.splitext(file)[1]}" for file in list]

我不确定是否有更好的方法,但看起来 str.format 通过 * 运算符解包列表可以工作:

import os

f_list = ['hello.txt', 'world.json']

names = ['{}_env{}'.format(*os.path.splitext(file)) for file in f_list]

在 Python 3.8+ 中,您还可以将海象 := 运算符与 f 弦结合使用(应该稍微更有效):

names = [f'{(p := os.path.splitext(file))[0]}_env{p[1]}' for file in f_list]

输出:

['hello_env.txt', 'world_env.json']

您可以使用地图:

import os

names = [f"{base}_env{ext}" for base,ext in map(os.path.splitext,f_list)]

您是否考虑过使用 pathlib 而不是将路径作为纯字符串进行操作?

如果将现有的文件路径字符串列表转换为路径对象列表...

from pathlib import Path

original_paths = [Path(file_name) for file_name in f_list]

...那么你修改后的路径可以这样构造,使用with_stem()方法:

new_paths = [path.with_stem(f'{path.stem}_env') for path in original_paths]

(“词干”是文件名中没有后缀的部分。)

您的情况可能有所不同,但我发现 pathlib 的描述性方法和属性名称使您更容易一目了然地分辨出与路径相关的代码的作用,这在您查看自己的代码时特别方便几个月后的代码。