条件付き積を生成できるようにしたい。この答えにとても似ています: リストのリストのすべての組み合わせ
使いたかったitertools.product(*listOfLists)
。ただし、私の問題は、1つのリストに1つの要素が含まれているということは、製品について他のリストを参照する必要があることを意味します。
例:
colors = ['red', 'blue', 'green']
fruits = ['apple', 'orange', 'banana']
locations = ['indoors', 'outdoors']
indoor_choices = ['bathroom', 'bedroom', 'kitchen']
green_choices = ['forest', 'light', 'dark']
ここでは、色、フルーツ、場所のすべての可能な選択を常に検討したいと思います。ただし、「indoor」の場合は、indoor_choicesも考慮し、「green」の場合は、より具体的な緑の色も選択します。これは、一部のブランチが分岐し続け、他のブランチが分岐しない可能性のツリーのようなものです。
したがって、上記のこのばかげた例では、次のようなforループを実行できます。
for c in colors:
for f in fruits:
for l in locations:
# etc
しかし、2つの異なるカテゴリがこの選択に基づいて分岐する可能性がある場合に何が起こるかという問題に遭遇します。
単純な(ハッキーな)解決策は、条件を手動でコーディングし、その中にforループを配置することです。
for c in colors:
for f in fruits:
for l in locations:
if c == 'green' and l == 'indoor':
for gc in green_choices:
for ic in indoor_choices:
# output
elif c == 'green':
for gc in green_choices:
# output
elif l == 'indoor':
for gc in green_choices:
# output
else:
# output
しかし、M個のリストに追加の分岐があるN個のリストがある場合の恐怖を想像してみてください。さらに悪いことに、ネストされた追加の分岐があります...基本的にこのハックは拡張できません。
何か案は?この問題は、一見難しいことが証明されています。