我需要检查是否可以复制文件名列表,然后根据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次,而且我猜测有一种方法可以一次完成!
谢谢!
答案 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)]
它会为文件列表中的每个项目循环一次排除列表,因此如果您有一个长排除列表,性能可能会受到影响。