【问题标题】:Python 2to3, iterating over list conditionally (filter vs list-comprehension)Python 2to3,有条件地迭代列表(过滤器与列表理解)
【发布时间】:2016-07-07 13:00:08
【问题描述】:

我正在使用2to3 工具从 Py2 -> Py3 移植一堆脚本。一个特别建议的更改让我有点困惑,所以我希望能得到一些帮助:

原行是:

for r in filter(lambda r: r.dir == direction, hm_regions):
    ... # do stuff with r

hm_regions 持有namedtuples,它有一个名为dir 的属性,并使用这个循环遍历那些匹配给定方向参数的那些。

建议的更改是

for r in [r for r in hm_regions if r.dir == direction]:

我知道这基本上做同样的事情,所以理论上结果应该不会改变(没有尝试过)。但是我发现双 for 循环非常丑陋,我想这不是最漂亮、最优雅的迭代方式。

我也试过for r in hm_regions if r.dir == direction:,由于语法错误而失败,这有点令人沮丧。

编辑:这里的另一个问题是改变是否有意义?我意识到建议更改的根本动机是filter 不再返回列表。但在这种情况下,我不使用列表,只是迭代它。因此它应该也能正常工作,对吧?

【问题讨论】:

  • 过滤速度较慢,但​​物有所值。见this link

标签: python-3.x list-comprehension python-2to3


【解决方案1】:

但我发现双 for 循环非常难看,而且我想这不是最漂亮、最优雅的迭代方式。 有什么建议吗?

使用简单的if:

for r in hm_regions:
    if r.dir == direction:
        # do stuff

for r in hm_regions:
    if r.dir != direction:
        continue
    # do stuff

【讨论】:

    【解决方案2】:

    我同意一行中的两个 for 循环并不是最令人愉悦的事情,但我不会过多地考虑解决方案。一些选项:

    1) 如果您对保持列表理解力不从心,请将其分成两行:

    lst = [r for r in hm_regions if r.dir == direction]
    for item in lst:
        ...
    

    2) 如果您不介意放弃理解,请在循环中使用 if:

    for r in hm_regions:
        if r.dir == direction:
            ...
    

    编辑:您可能想查看this link。生成器可能是一个不错的选择,但它取决于代码的上下文。

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2020-12-03
      • 1970-01-01
      • 2015-10-06
      • 2022-01-10
      • 2012-01-14
      • 2011-08-05
      • 2015-07-27
      相关资源
      最近更新 更多