如果条件列表理解中的列表元素

时间:2017-07-27 11:07:19

标签: python list-comprehension

我想知道是否可以替换它:

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)]

感谢您的帮助

3 个答案:

答案 0 :(得分: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)]

答案 1 :(得分: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]

答案 2 :(得分: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 ]

注意:我已将name放在ext之前。

内部列表生成一个元组列表,即名称和ext值。