Python 检查字符串包括/不包括不同列表中的值
我正试图实现以下代码,但以一种更为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
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)