是否可以在python中使用in in-line

时间:2015-08-07 07:55:12

标签: python for-loop list-comprehension

我正在使用迭代文件列表的python应用程序。我想根据某些条件得到一些物品。我知道文件是按修改时间列出的,我想只通过60秒之前修改的文件进行迭代。所以我这样做:

t = int(datetime.now().strftime('%s'))
get_quie = [[f.filename, f.st_size]
            for f in reversed(sftp.listdir_attr('./'))
            if t - f.st_mtime < 60 or t - f.st_atime < 60 ]

tf.st_mtime之间的差异开始增长时,我想添加突破此for循环的条件。

是否可以在内联循环中进行,或者我应该使用常规的for x in list循环?

3 个答案:

答案 0 :(得分:3)

你不能在列表理解中使用break,不能。 break是一个陈述,列表理解是一个表达;你不能把陈述放在表达式中。

您必须使用常规for循环(这是一个可以包含其他语句的语句),或者找到一种方法将if <condition>过滤器添加到跳过的列表理解中循环中的其余元素。

答案 1 :(得分:2)

这是takewhile将要做的事情。它会在条件满足时采用所有元素。当条件不满足时,它基本上会打破&#34;:

from itertools import takewhile

...
get_quie = [
    [f.filename, f.st_size]
    for f in takewhile(
        lambda f: t - f.st_mtime < 60 or t - f.st_atime < 60,
        reversed(sftp.listdir_attr('./'))
    )
]

答案 2 :(得分:0)

不,虽然它们都使用for,但for语句与列表理解完全不同。列表理解在它可能包含的内容方面是非常严格的(基本上for <target> in <array> if <condition>,你可以重复开头一个最后的结果 - 但那是关于它的。)