0

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

4

2 回答 2

0

但我发现双重 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
于 2016-07-07T13:04:19.600 回答
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:
        ...

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

于 2016-07-07T13:17:55.463 回答