2016-07-06 15 views
0

ネストされたループを使用するときにインデントを減らす方法はありますか?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) 
+0

'do_thing'行を' ['の前に移動してください。新しい行とコロンをすべて取り出す。末尾に ']'を追加してください。 Voila!しかし、しないでください。リスト内包表記は、リストを作成する簡単な方法です。 'do_thing(...)'の返り値のリストを作成するのは良い考えではありません。リスト内包は、副作用ではなく、リストを作成するために使用する必要があります。 – zondo

答えて

2
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

'product(sources、sources)'は 'product(sources、repeat = 2)'と書くこともできます。特にiterableの2次元以上の製品が必要な場合に便利です。 – plamut

+0

@plamutはい、私は一番上にあり、それをコピーするのを忘れました。 :)チップありがとう。 – erip

2

はい、ネストされたループを交換するための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関数(直接ドキュメントからの)「入力のデカルト積はイテラブル」ん。

関連する問題