ネストされたループを使用するときにインデントを減らす方法はありますか?Pythonのネストループを使用するときにインデントを減らす
for source_i in sources:
for source_j in sources:
for ni in source_i.nodes:
for nj in source_j.nodes:
if ni != nj:
do_thing(ni, nj)
ネストされたループを使用するときにインデントを減らす方法はありますか?Pythonのネストループを使用するときにインデントを減らす
for source_i in sources:
for source_j in sources:
for ni in source_i.nodes:
for nj in source_j.nodes:
if ni != nj:
do_thing(ni, nj)
for source_i in sources:
for source_j in sources:
pass
これはsources
と自身のデカルト積でペアを反復処理と同じものです。これはitertools
をインポートすることで、1行で記述することができます:ここ
import itertools
for (i,j) in itertools.product(sources, repeat=2):
pass
同じパターン:だから今はネストでき、それら
for (ni, nj) in itertools.product(i.nodes, j.nodes):
pass
:
for ni in i.nodes:
for nj in j.nodes:
pass
これはのように書き換えることができます
import itertools
for (i,j) in itertools.product(sources, repeat=2):
for (ni, nj) in itertools.product(i.nodes, j.nodes):
if ni != nj:
do_thing(ni, nj)
はい、ネストされたループを交換するための1つの方法はitertools.productを使用することである。
from itertools import product
for source_i, source_j in product(sources, repeat=2):
for ni, nj in product(source_i.nodes, source_j.nodes):
...
product
関数(直接ドキュメントからの)「入力のデカルト積はイテラブル」ん。
'do_thing'行を' ['の前に移動してください。新しい行とコロンをすべて取り出す。末尾に ']'を追加してください。 Voila!しかし、しないでください。リスト内包表記は、リストを作成する簡単な方法です。 'do_thing(...)'の返り値のリストを作成するのは良い考えではありません。リスト内包は、副作用ではなく、リストを作成するために使用する必要があります。 – zondo