2017-07-27 162 views
0

我想知道是否有可能取代這個:如果列表理解中的列表元素條件

results = [x for x in os.listdir(dir_path) if os.path.splitext(x)[1] == ".tif" and "abc" in os.path.splitext(x)[0]] 

的東西,如:

results = [x for x in os.listdir(dir_path) if ext == ".tif" and "abc" in name for ext, name in os.path.splitext(x)] 

感謝您的幫助

+1

什麼是''abc「名字爲ext,名字在os.path.splitext(x)'假設是指?你想在這裏完成什麼? –

+0

你的意思是:'[x for os.listdir(dir_path)if ext ==「.tif」and「abc」in os.path.splitext(x)[1]]'??? –

+0

@ juanpa.arrivillaga是的,謝謝,我的意思是相反。而「abc」只是一個任意的名字。我試圖列出所有在文件名中有「abc」的文件,同時有擴展名「.tif」 – MMagician

回答

1

您可以使用內部生成器表達式定義nameext

results = [x for x, name, ext in ((x, *os.path.splitext(x)) for x in os.listdir(dir_path)) 
      if ext == ".tif" and "abc" in name] 

這裏,*os.path.splitext(x)拆包調用外部列表理解中的nameext變量的結果(僅在Python 3中)。對於舊版本,您可以改用(x,) + os.path.splitext(x)。還要注意,splitext將返回一個元組(name, ext),而不是(ext, name)

另一種方法是,不要使用splitext,而是直接檢查文件名,假定名稱部分中要查找的部分不能出現在文件名的擴展部分。

results = [x for x in os.listdir(dir_path) if x.endswith(".tif") and "abc" in x] 
3

你行很長,你可能想把它分成多行。你可以換你條件的函數:

def filter_file(path): 
    ext, name = os.path.splitext(path) 
    if not ext == '.tif': 
     return False 
    return 'abc' in name 

然後用

results = [x for x in os.listdir(dir_path) if filter_file(x)] 
+0

當然,這也可以。 – MMagician

1

我猜測,這是你想要什麼:

results = [name + ext for name, ext in [os.path.splitext(x) for x in os.listdir(dir_path)] if ext == ".tif" and "abc" in name ] 

注:我已經把nameext之前。

而內部列表正在生成名稱和ext值的元組列表。