[英]List comprehension removing elements from a list
我正在開發一個使用列表理解將文件擴展名.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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.