Python 2to3,有条件地迭代列表(filter vs list-comprehension)

时间:2016-07-07 13:00:08

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

我正在从Py2移植一堆脚本 - > Py3使用2to3工具。一个特别建议的改变使我有点困惑,所以我很感激一些帮助:

原始行是:

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不再返回列表。但在这种情况下,我不会使用该列表,只是迭代它。因此它应该也能正常工作,对吗?

2 个答案:

答案 0 :(得分:0)

  

但是我发现双循环非常难看,我想这不是进行迭代的最漂亮,最优雅的方法。   建议?

使用简单的if

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

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

答案 1 :(得分:0)

我同意一行中的两个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。生成器可能是一个很好的选择,但它取决于代码的上下文。