列表理解:如果未包含在子字符串列表中,则检索有效字符串

时间:2018-02-22 16:39:45

标签: python python-3.x

我需要检查是否可以复制文件名列表,然后根据fobidden子字符串列表进行检查。

这就是我所拥有的:

exclude = ['ex','xe']
files = ['include', 'exclude']

这就是我的期望:

['include']

我已经使用了列表理解,如下所示:

[a[0] for a in [(f, any([e in f for e in exclude])) for f in files] if not a[1]]

我创建一个元组(f, any([e in f for e in exclude])),检查文件名与排除子字符串是否存在对应关系。 我对文件列表for f in files中的每个文件执行此操作,并且仅包括那些不包含在子字符串if not a[1]中的文件。

有更好的方法吗?一个更pythonic的? 因为我在文件列表中循环了2次,而且我猜测有一种方法可以一次完成!

谢谢!

2 个答案:

答案 0 :(得分:5)

我真的不明白你的逻辑。看起来您正在使用布尔值构建元组,然后将False值过滤掉。

在我看来,这也有效,而且更简单:

exclude = ['ex','xe']
files = ['include', 'exclude']

print([x for x in files if not any(e in x for e in exclude)])

循环遍历files,对于每个文件,检查其中是否包含exclude成员。

请注意,您无需在any中构建实际列表。省略方括号,让any执行惰性求值,速度更快。

答案 1 :(得分:0)

这只会循环遍历文件列表一次:

[file for file in files if not any(item in file for item in exclude)]

它会为文件列表中的每个项目循环一次排除列表,因此如果您有一个长排除列表,性能可能会受到影响。