Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで複数のリストからすべての組み合わせ(順列)を生成する方法

Pythonでは、2つ以上のリストが与えられたとき、一方のリストの各要素と他方のリストの各要素をすべて組み合わせた結果(直積)を取得したい場面がよくあります。本記事では、その代表的な2つの方法——ネストしたforループを使う方法と、標準ライブラリitertoolsを使う方法——をわかりやすく解説します。

方法1: forループ(リスト内包表記)を使う

最もシンプルなアプローチは、forループを入れ子にする方法です。外側のループで1つ目のリスト、内側のループで2つ目のリストを走査し、それぞれの要素のペアを新しいリストとして格納します。Pythonでは、この処理をリスト内包表記を使って1行で簡潔に書くことができます。

コード例

A = [5, 8]
B = [10, 15, 20]

print("元のリスト : ", A, B)
permutations = [[m, n] for m in A for n in B]
print("すべての組み合わせ : ", permutations)

実行結果

上記のコードを実行すると、次のような出力が得られます。

元のリスト : [5, 8] [10, 15, 20]
すべての組み合わせ : [[5, 10], [5, 15], [5, 20], [8, 10], [8, 15], [8, 20]]

この例では、リストAの要素「5」と「8」のそれぞれに対して、リストBの3つの要素「10」「15」「20」が順番に組み合わされ、合計6通りのペア(2 × 3 = 6)が生成されていることがわかります。

方法2: itertoolsモジュールを使う

よりPythonicで効率的な方法として、標準ライブラリのitertoolsモジュールに含まれるproduct()関数を使用する方法があります。この関数は、内部でネストしたforループと同等の処理を行い、複数のイテラブルのデカルト積(直積)を返します。

コード例

import itertools

A = [5, 8]
B = [10, 15, 20]

print("元のリスト : ", A, B)
result = list(itertools.product(A, B))
print("すべての組み合わせ : " + str(result))

実行結果

上記のコードを実行すると、次のような出力が得られます。

元のリスト : [5, 8] [10, 15, 20]
すべての組み合わせ : [(5, 10), (5, 15), (5, 20), (8, 10), (8, 15), (8, 20)]

なお、itertools.product()はタプルの形式で結果を返す点に注意してください。リスト形式が必要な場合は、[list(p) for p in result]のように変換することも可能です。

補足: 順列(permutations)との違い

厳密には、異なるリスト間の要素を組み合わせる操作は「直積(product)」と呼ばれます。一方、同じリスト内の要素の並べ替え(順列)を求めたい場合は、itertools.permutations()を使用します。用途に応じて適切な関数を選択しましょう。

  • itertools.product(): 複数のリスト(または1つのリストの重複あり組み合わせ)から全ペアを生成
  • itertools.permutations(): 1つのリストから要素の並び順を考慮した順列を生成

まとめ

2つのリストの全要素の組み合わせを取得するには、リスト内包表記によるネストしたforループでも実装できますが、itertools.product()を使う方がコードが簡潔になり、パフォーマンス面でも優れています。特に3つ以上のリストを扱う場合や大規模なデータを処理する場合は、itertoolsの活用をおすすめします。

  1. 指定された文字列のすべての順列を出力するPythonプログラム

    本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +

  2. Pythonで文字列のすべての順列を取得する方法【itertoolsと再帰で解説】

    itertools.permutationsを使った方法 Pythonで文字列のすべての順列(並べ替え)を求める最も簡単な方法は、標準ライブラリのitertoolsモジュールにあるpermutations()関数を使用することです。この関数は、イテラブルなオブジェクトから要素を取り出し、指定した長さrの順列をタプルとして順番に返します。 結果を文字列として取得するには、関数の戻り値をループで処理し、各タプルの要素をjoin()で連結します。以下に具体例を示します。 from itertools import permutations result = [.join(p) for p in p