2016-07-24 122 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 
>>> 
相关问题