2016-07-07 74 views
0

我正在使用2to3工具从Py2 - > Py3移植一堆脚本。一个特别的建议的修改搞糊涂了一点,这样我会很感激一些帮助是:Python 2to3,有条件地迭代列表(过滤器vs列表理解)

原线路:

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

过滤速度较慢,因为它的价值。请参阅[此链接](http://stackoverflow.com/questions/3013449/list-filtering-list-comprehension-vs-lambda-filter) – chrislessard

回答

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 
0

我同意两个用于在一行的循环是不看的最令人愉快的事,但我不会过多地解决这个问题。一些选项:

1)如果你在保持列表理解deadset,它分成两行:

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

2)如果在循环中使用的,如果你不介意开沟理解:

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

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