2016-07-07 60 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。生成器可能是一個很好的選擇,但它取決於代碼的上下文。