簡體   English   中英

列表理解從列表中刪除元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM