列表理解从列表中删除元素

List comprehension removing elements from a list

我正在开发一个程序,使用 list comprehension.

将文件扩展名 .hpp 替换为 .h

这是我的代码:

filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]
# Generate newfilenames as a list containing the new filenames

filenames = [x.replace("hpp", "h") for x in filenames if x[-3:] == "hpp"]

print(filenames) 
# Should be ["program.c", "stdio.h", "sample.h", "a.out", "math.h", "hpp.out"] 

这是我的输出:

['stdio.h', 'sample.h', 'math.h']

谁能解释为什么我的程序只返回已修改的元素以及如何修复它?

一个快速的解决方案是将 .hpp 替换为 .h(包括点)。这当然只有在您知道 .hpp 不会出现在文件名中时才有效。

代码:

filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]
# Generate newfilenames as a list containing the new filenames

filenames = [x.replace(".hpp", ".h") for x in filenames]

print(filenames) 

输出:

['program.c', 'stdio.h', 'sample.h', 'a.out', 'math.h', 'hpp.out']

关于为什么你的程序不工作: if 排除了不以 .hpp 结尾的元素,因此它们不能在最终列表中。 (我认为这在对您的问题的评论中解释得很好)

您可以使用负索引参数来仅考虑字符串的最后 3 个元素(因为这是文件扩展名),如下所示:

filenames = ["program.c", "stdio.hpp", "sample.hpp", "a.out", "math.hpp", "hpp.out"]
filenames = [f'{x[:-3]}{x[-3:].replace("hpp", "h")}' for x in filenames]

print(filenames)

输出:

['program.c', 'stdio.h', 'sample.h', 'a.out', 'math.h', 'hpp.out']

JANO 的回答非常好,我认为它对用例来说没问题。但是如果你想管理像 'myfile.hpp.out' 这样的文件名的情况,你将需要更复杂的东西,而且效率可能有点低:

filenames = [(lambda x:x.replace("hpp", "h") if x[-3] == 'hpp' else x)(x) for x in filenames]