Python 检查字符串包括/不包括不同列表中的值

Python 检查字符串包括/不包括不同列表中的值,python,list,python-3.x,generator,os.walk,Python,List,Python 3.x,Generator,Os.walk,我正试图实现以下代码,但以一种更为python的方式。使用生成器,我可以根据单个列表的项目进行操作: listIncludedFolders = ["Criteria1"] listExcludedFolders = ["Criteria2"] for dirpath, dirnames, filenames in os.walk(root): proceed = False for each in listIncludedFolders: if each

我正试图实现以下代码,但以一种更为python的方式。使用生成器,我可以根据单个列表的项目进行操作:

listIncludedFolders = ["Criteria1"]
listExcludedFolders = ["Criteria2"]

for dirpath, dirnames, filenames in os.walk(root):

    proceed = False

    for each in listIncludedFolders:
        if each in dirpath:
            proceed = True

    if proceed == True:
        for each in listExcludedFolders:
            if each in dirpath:
                proceed = False

    if proceed == True:
        print(dirpath)
…但我无法添加第二个比较。我在下面的示例中设法获得了一个附加标准,但我需要迭代附加标准的列表:

if any(dir in dirpath for dir in listIncludedFolders):
    print(dirpath)

如何“干净地”实现这一目标?

将两个条件与
结合,并将
运算符与另一个
调用结合:

if any(dir in dirpath for dir in listIncludedFolders if("Criteria2" not in dirpath)):
    print(dirpath)
或者使用另一个
调用(条件为否定):

顺便说一句,
(..for..in..if..)
是一个,而不是一个。

这非常有效:

if any(each in dirpath for each in listIncludedFolders) and \
       all(each not in dirpath for each in listExcludedFolders):
    print(dirpath)

您可以避免进入首先被排除的子树。这个解决方案也比原来的方法更健壮,假设测试子字符串以确定文件夹的包含和排除不是什么意思(您真的想排除名为“Criteria2345”的文件夹吗?)


但是请注意,如果
root
在排除列表中,则在该实现中将忽略它。

我不确定是否遵循您的建议。我看到的结果是,使用os.walk无法输入排除的目录。我还知道os.path.walk已被弃用,应该避免使用。我当然不想在目录中浪费时间……嘿,谢谢你的提示,
os.path.walk
不推荐使用。我确信上面的代码也会进入排除的目录。事实证明,使用os.walk也可以避免这种情况。我相应地编辑了答案。谢谢-我试过你的代码。它的运行速度比我发布的答案快得多,但它也能找到更多的文件夹,而不是我发布的答案所找到的文件夹。可能是因为行“if set(dirpath.split(os.path.sep))&set(listcludedFolders):”。你能解释一下这句话吗?我不知道它在做什么。左边的表达式是属于
dirpath
的所有目录名的集合。右侧的表达式是
listcludedFolders
的元素集。运算符
返回两个集合的交集。由于空集的真值是
False
,要打印
dirpath
,必须至少包含一个也在“listIncludedFolders”中的目录。这比另一个解决方案找到更多文件夹的原因是,在此解决方案中,只有
dirpath
被排除,其中包含也在“listIncludedFolders”中的path元素
listedexcludedfolders
。在另一种解决方案中,也排除了子字符串等于
listedexcludedfolders
中任何元素的
dirpath
if any(each in dirpath for each in listIncludedFolders) and \
       all(each not in dirpath for each in listExcludedFolders):
    print(dirpath)
listIncludedFolders = ["Criteria1"]
listExcludedFolders = ["Criteria2"]

for dirpath, dirnames, filenames in os.walk(root):

    if any(each in dirpath for each in listIncludedFolders) and \
            not any(each in dirpath for each in listExcludedFolders):
        print(dirpath)
for dirpath, dirnames, filenames in os.walk(root):
    if set(dirpath.split(os.path.sep)) & set(listIncludedFolders):
        print(dirpath)
    for ex in [dnam for dnam in dirnames if dnam in listExcludedFolders]:
        dirnames.remove(ex)