【问题标题】:Is it possible to use break in in-line for in python是否可以在python中使用break in in-line for
【发布时间】:2015-08-07 07:55:11
【问题描述】:

我正在编写一个遍历文件列表的 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 循环中执行此操作,或者我应该使用常规的 for x in list 循环?

【问题讨论】:

  • 你不能在列表理解中使用break,不。 break 是一个语句,列表推导是一个表达式;你不能把语句放在表达式中。
  • 感谢您的快速答复。那是正确的答案。

标签: python for-loop list-comprehension


【解决方案1】:

你不能在列表理解中使用break,不。 break 是语句,列表推导是表达式;你不能把语句放在表达式中。

您要么必须使用常规的 for 循环(这是一个可以包含其他语句的语句),要么找到一种方法将 if &lt;condition&gt; 过滤器添加到跳过其余部分的列表推导中循环中的元素。

【讨论】:

    【解决方案2】:

    这就是takewhile 要做的事情。满足条件时,它将采用所有元素。当条件不满足时,它本质上会“中断”:

    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('./'))
        )
    ]
    

    【讨论】:

    • 谢谢。这真是一个很好的例子。我查看了文档,它的作用是创建一个处理逻辑的函数。我正在寻找没有附加功能的解决方案。它仍然是高度可用的功能。 lambda 关键字对我来说是新的!
    【解决方案3】:

    不,尽管它们都使用for,但 for 语句与列表推导式完全不同。列表理解对它可能包含的内容非常严格(基本上是for &lt;target&gt; in &lt;array&gt; if &lt;condition&gt;,您可以重复开头并留下结尾 - 仅此而已)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多