2017-07-27 165 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值的元组列表。