我正在从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
不再返回列表。但在这种情况下,我不会使用该列表,只是迭代它。因此它应该也能正常工作,对吗?
答案 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。生成器可能是一个很好的选择,但它取决于代码的上下文。