列表理解从列表中删除元素
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]
我正在开发一个程序,使用 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]