0

このツールを使用して、Py2 -> Py3 から多数のスクリプトを移植中2to3です。特定の提案された変更が私を少し混乱させたので、それについての助けをいただければ幸いです。

元の行は次のとおりです。

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

hm_regionsnamedtuples呼び出されたプロパティを保持しdir、このループを使用して、特定の方向パラメーターに一致するものを反復処理します。

提案された変更は、

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

これは本質的に同じことを行うことを理解しているため、理論的には結果はまったく変わらないはずです(試していません)。しかし、二重forループは非常に醜いと思います。これは、この反復を行うための最も美しく、最も優雅な方法ではないと思います。

構文エラーが原因で失敗するものも試しfor r in hm_regions if r.dir == direction:ましたが、これは少しフラストレーションがたまりました。

編集:ここでのもう 1 つの質問は、変更することに意味があるかどうかです。提案された変更の根底にある動機は、filterもはやリストを返さないことだと私は認識しています。しかし、このコンテキストでは、リストを反復処理する以上の目的でリストを使用しません。したがって、それも同様に機能するはずですよね?

4

2 に答える 2

0

1 行に 2 つの for ループがあるのは見栄えがよくないことには同意しますが、解決策を考えすぎないようにします。いくつかのオプション:

1) リストの理解を維持することに行き詰まっている場合は、それを 2 行に分割します。

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 に答える