複数のリストの直積を取得する方法 質問する

複数のリストの直積を取得する方法 質問する

リストのグループからデカルト積 (値の可能なすべての組み合わせ) を取得するにはどうすればよいですか?

例えば、

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]

どうすればこれを入手できますか?

[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5), ...]

このテクニックの一般的な応用例の1つは、深くネストされたループを回避することです。ネストされた for ループを避けるより具体的な重複については、このテクニックを使ってリスト値を持つ辞書を「展開」することもできます。Python 辞書の順列を辞書のリストに結合する

同じリストの直積を複数回取得したい場合、itertools.productそれをエレガントに処理できます。リスト内の各要素のペアに対する操作またはリスト(リスト自体の直積)から「繰り返しを含む順列」を取得するにはどうすればよいですか?

について既に知っている多くの人は、itertools.product例えばリストのリストではなく、入力シーケンスごとに個別の引数が期待されるという事実に苦労しています。受け入れられた回答では、 でこれを処理する方法を示しています。ただし、引数を展開するためにここで*を使用することは、関数呼び出しで使用される他の場合と基本的に違いはありません。*タプルを引数に展開するこのトピックについては(必要に応じて、代わりにこれを使用して重複する質問を閉じます)。

ベストアンサー1

使用itertools.productこれは Python 2.6 以降で利用可能になりました。

import itertools

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]
for element in itertools.product(*somelists):
    print(element)

これは以下と同じです:

for element in itertools.product([1, 2, 3], ['a', 'b'], [4, 5]):
    print(element)

おすすめ記事