2016-07-07 8 views
0

2to3ツールを使用して、Py2 - > Py3から一連のスクリプトを移植しています。一つの特定の提案の変更は私に少し混乱し、私はそれにいくつかの助けいただければと思います:Python 2to3、条件付きでリストを反復する(フィルタ対リスト解説)

を元の行は次のようになります。

for r in filter(lambda r: r.dir == direction, hm_regions): 
    ... # do stuff with r 

hm_regionsは私が反復dirと呼ばれる性質を持っており、このループを使用してnamedtuplesを保持しています指定された方向パラメータに一致するものよりも優先されます。

示唆した変更は、私は理論的には結果がすべてで変更すべきではありませんので、これは、本質的に同じことをしていることを理解し

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

です(試していません)。しかし、私はdouble forループが非常に醜いと思う、そして、私はこれがこの繰り返しを行うための最もきれいで、最も優雅な方法ではないと思う。

また、私はfor r in hm_regions if r.dir == direction:を試してみましたが、構文エラーのために失敗しました。これは少し不満でした。

EDIT:もう1つの質問は、まったく変更しても意味がありますか?提案された変更の根底にある動機は、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つのラインでループのための2つが見て最も楽しいものではありませんが、私はしないことに同意解決策をあまりにも過剰に考える。いくつかのオプション:

1)あなたは、リストの内包を維持する上deadsetだ2行にそれを破る場合:

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をチェックアウトすることができます。ジェネレータは良い選択肢かもしれませんが、コードのコンテキストに依存します。

関連する問題