5

リストのリストがあります。itertoolsを使用して、私は基本的にやっています

product([A、B]、[C、D]、[E、F、G])の結果の場合:#各結果をテストします

結果は目的の製品であり、各結果には各リストの1つの要素が含まれています。私のコードは、各結果を要素ごとにテストし、最初の(そして最良の)「良い」ものを探します。テストする数が非常に多い場合があります。

最初の結果「ACE」をテストしているとしましょう。2番目の要素「C」をテストしたときに「ACE」が悪い結果であることがわかったとします。「ACF」または「ACG」をテストする必要はありません。失敗したACEから直接ADEの試行にスキップしたいと思います。とにかく、床に不要な結果を投げることなくこれを行うには?

ネストされたforループを使用してこれを実装する場合、ループ内のforループインデックスを操作しようとしますが、それはあまり良いことではありません...しかし、多くの結果のテストをスキップしたいと思います。itertoolsで効率的にスキップできますか?

4

1 に答える 1

1

itertoolsは、あなたが抱えている懸念に対処するための最良の方法ではありません。

組み合わせるセットが3つしかない場合は、ループして失敗したときにループを解除します。(コーディングが複雑な場合は、変数を設定してすぐ外で中断してください。

for i1 in [A, B]:
  for i2 in [C, D]:
      for i3 in [E, F, G]:
         if not test(i1, i2, i3):
           break

ただし、持っているセットの数が可変である場合は、再帰関数(バックトラック)を使用してください。

 inp_sets = ([A,B],[C,D],[E,F,G])
 max_col = len(inp_sets)
 def generate(col_index, current_set):
     if col_index == max_col:
         if test(current_set):
             return current_set
         else:
             return None
     else:
         found = False
         for item in inp_sets[col_index]:
             res = generate(col_index+1, current_set + [item]):
             if res:
                  return res
             elif (col_index == max_col - 1):
                  # Here we are skipping the rest of the checks for last column
                  # Change the condition if you want to skip for more columns
                  return None

result = generate(0, [])
于 2010-11-16T04:48:18.110 に答える