繁体   English   中英

最蟒蛇的方式不断地遍历列表直到满足条件?

[英]Most pythonic way to continually iterate over a list until a condition is met?

我有一个列表,其中包含异步更改的字符串值。 我想不断检查列表,直到列表中没有任何项目包含某个子字符串,然后执行命令。

为了使事情不太抽象,我将解释我的具体情况。 我正在使用selenium来自动下载多个文件,并且在所有文件下载完成后,我想关闭webdriver。 我目前对该问题的解决方法如下:

while True:
    for file in os.listdir(download_dir):
        if 'tmp' in file.lower():
            break
    else:
        driver.quit()
        break

基本上,检查列表中的任何元素(在这种情况下为下载目录中的文件名)是否包含“ tmp”,以及是否确实开始再次检查。 如果检查了整个列表,并且其中没有带“ tmp”的元素,则退出Web驱动程序并退出循环。

该解决方案效果很好,但是在我曾经提出的堆栈溢出线程之一(请参阅此处 )中,许多人说,虽然类似的方法行之有效,但这可能是一种糟糕的方法。

所以我的问题是,有没有更多的pythonic方式可以做到这一点? 还是如果不是一般而言更好的方法? 我的解决方案没有问题,但是其他答案中的一些评论给了我一点我应该的感觉。

如果可以进行区分大小写的匹配,则可以使用glob模块。 如果没有,则可以组合os.listdirfnmatch.fnmatch来创建不区分大小写的匹配:

import glob
import fnmatch
import os

download_dir = "/tmp"

def glob_insensitive(path, pattern):
    return fnmatch.filter(os.listdir(path), pattern)

while glob.glob( os.path.join(download_dir, "*tmp*") ):
    pass # or better sleep
driver.quit()

while glob_insensitive( download_dir, "*tmp*" ):
    pass # or better sleep
driver.quit()

对于一般的样式问题,我可以将any与生成器表达式一起使用:

while [ f for f in os.listdir(download_dir) if "tmp" in f.lower() ]:
    pass# or better sleep some time
driver.quit()

生成器表达式比构造列表更好,但是如果列表为空,则无法轻松测试。

我可能是错的,但对我而言,“ pythonic”对任何说Python的人来说都很容易理解。 您的代码段很小,几乎所有使用python的人都明白它的作用。

但是,如果您的代码存在问题,那就是它需要一段说明正在发生什么以及为什么这么做的解释。 相反,您可以编写一些不言自明的内容。

# we assume the file itself doesn't contain 'tmp'
is_ready = lambda filename: not ('tmp' in filename.lower())

while True:
    if all(is_ready(a_download) for a_download in os.listdir(download_dir)):
        driver.quit()
        break

我认为使用一点itertools魔术来避免while循环更像是Python:

from itertools import repeat
from itertools import chain

for file in chain.from_iterable(repeat(os.listdir(download_dir))):
    if 'tmp' in file.lower():
        driver.quit()
        break

基本上,我们使用repeat创建一个迭代器,该迭代器将永远返回listdir迭代器。 现在,我们有一个无限的迭代器惰性列表,基本上是一个迭代器。 然后from_iterable将迭代器上的该迭代器转换为单链迭代器。

由于我们只有一个循环,因此我们不必担心双重中断问题,并且可以大大简化控制逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM