2016-07-24 125 views
0

我想修改一個列表以刪除文件擴展名不匹配的條目。我寫這多工作「或」條件Python - 檢查是否有任何的多個條件是真的

from os import listdir 
image_extensions = ['jpg','.png'] 

files = listdir('/home') 
files = [x for x in files if '.jpg' in x or '.png' in x] 

print files 

我想有這樣的使用image_extensions變量,這樣我可以輕鬆地添加更多的條件。我嘗試最新的東西失敗,出現「需要字符串作爲左操作數,沒有列出」:

from os import listdir 
image_extensions = ['jpg','.png'] 

files = listdir('/home') 
files = [x for x in files if any(s for s in image_extensions in x)] 

print files 

回答

3

這應該這樣做:

files = [x for x in files if any(s in x for s in image_extensions)] 
#        |<-->| 

檢查任何擴展的包含在文件中命名x

+0

這個工程很漂亮!現在,我看到它寫出了正確的方式,這是有道理的! – onomatopoeia

+0

如果您覺得這是您問題的最佳答案,請記住接受此答案 –

0

替代解決方案是:

>>> filter(lambda f: filter(f.endswith, image_extensions), files) 

時間分析這個表達式與前一個答案相比,顯示出前一個有點改進:

>>> import timeit 
>>> 
>>> timeit.timeit("import os;l = os.listdir('.');ext = ['txt', 'ini', 'cfg'];filter(lambda f: filter(f.endswith, ext), l)", number=10000) 
0.6541688442230225 
>>> 
>>> 
>>> timeit.timeit("import os;l = os.listdir('.');ext = ['txt', 'ini', 'cfg'];files=[x for x in l if any(s in x for s in ext)]", number=10000) 
0.64410400390625 
>>> 
相關問題