我正在使用迭代文件列表的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 ]
当t
和f.st_mtime
之间的差异开始增长时,我想添加突破此for循环的条件。
是否可以在内联循环中进行,或者我应该使用常规的for x in list
循环?
答案 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>
,你可以重复开头一个最后的结果 - 但那是关于它的。)