Pythonで組み合わせを作る!itertools.productの完全ガイド

Pythonで組み合わせを効率的に作成したいときに役立つのが、itertoolsモジュールの product 関数です。この関数を使うと、リストやタプルのすべての直積(デカルト積)を簡単に生成できます。

この記事では、itertools.product の使い方から、実践的なユースケースや注意点までを徹底解説します!

cherry

itertools.productとは?

itertools.product は、複数のリストやタプルなどのイテラブルからすべての「全組み合わせ」を生成するための関数です。数学的には「デカルト積」と呼ばれる処理を行います。

例えば次のように使います:

import itertools

a = [1, 2]
b = ['x', 'y']

result = list(itertools.product(a, b))
print(result)  # 出力: [(1, 'x'), (1, 'y'), (2, 'x'), (2, 'y')]

このコードでは、リスト ab の全組み合わせが生成され、タプルとしてリストに格納されます。


itertools.product の使い方

基本的な使い方

複数のイテラブルを引数として渡すだけで、それらの全組み合わせを生成できます。次の例では、3つのイテラブルを使っています。

a = [1, 2]
b = ['x', 'y']
c = [True, False]

result = list(itertools.product(a, b, c))
print(result)
# 出力: [(1, 'x', True), (1, 'x', False), (1, 'y', True), ...]

繰り返し回数を指定する(repeat引数)

同じリストやタプルを繰り返して組み合わせを生成したい場合は、repeat を使います。例えば、3桁のバイナリ数列を生成する例です。

digits = [0, 1]

# 3桁のバイナリ数列を生成
result = list(itertools.product(digits, repeat=3))
print(result)
# 出力: [(0, 0, 0), (0, 0, 1), (0, 1, 0), ...]

実践的なユースケース

1. 商品バリエーションを列挙する

ECサイトなどで、商品のサイズ、色、スタイルの全バリエーションを生成したいときに使えます。

sizes = ['S', 'M', 'L']
colors = ['Red', 'Blue']
styles = ['Casual', 'Formal']

combinations = list(itertools.product(sizes, colors, styles))
for combo in combinations:
    print(combo)

2. 機械学習のハイパーパラメータ探索

機械学習でグリッドサーチ(パラメータの総当たり探索)を行うときにも役立ちます。

learning_rates = [0.1, 0.01]
batch_sizes = [16, 32]
optimizers = ['adam', 'sgd']

for params in itertools.product(learning_rates, batch_sizes, optimizers):
    print(f"Testing with params: LR={params[0]}, Batch={params[1]}, Optimizer={params[2]}")

知っておきたい注意点

1. 組み合わせが巨大になる場合の対処法

入力するイテラブルが多い場合、組み合わせ数は指数的に増加します。たとえば:

list1 = range(100)
list2 = range(100)
list3 = range(100)

# 組み合わせの総数
print(100 * 100 * 100)  # 出力: 1,000,000

対策

  • 条件を絞る: 必要な条件だけを満たす組み合わせを処理する。
  • イテレータを直接使う: リストに変換せずに順次処理することでメモリを節約。

2. 他の itertools 関数との違い

itertools には、product の他にも組み合わせや順列を生成する便利な関数があります。それぞれの用途を簡単にまとめます。

関数用途使用例
itertools.productリストの全組み合わせを生成(ネストループの代替)[(1, ‘a’), (1, ‘b’)]
itertools.permutations要素の並び替え(順列)を生成[(1, 2), (2, 1)]
itertools.combinations順序を無視した組み合わせを生成[(1, 2)]
itertools.combinations_with_replacement重複を許した組み合わせを生成[(1, 1), (1, 2)]

具体例

import itertools

a = [1, 2, 3]

print(list(itertools.permutations(a, 2)))  # 順列
print(list(itertools.combinations(a, 2)))  # 組み合わせ
print(list(itertools.combinations_with_replacement(a, 2)))  # 重複組み合わせ

サンプルコード集

以下はすぐに使える便利なサンプルコード集です。

数値と文字列の直積を作る

numbers = [1, 2, 3]
letters = ['A', 'B']

result = list(itertools.product(numbers, letters))
print(result)

条件付き組み合わせを生成

a = [1, 2, 3]
b = [4, 5, 6]

for x, y in itertools.product(a, b):
    if x + y > 7:
        print(x, y)

巨大なデータをイテレータで処理

large_list1 = range(1000)
large_list2 = range(1000)

# イテレータのまま条件付きで処理
for x, y in itertools.product(large_list1, large_list2):
    if x + y > 1500:
        print(x, y)
        break

まとめ

itertools.product は、複数リストの全組み合わせを効率的に生成できる便利な関数です。この記事のポイントを振り返ります:

  1. 全組み合わせを簡単生成: ネストループを使わずにコードをシンプルに。
  2. 応用範囲が広い: 商品バリエーション、機械学習のハイパーパラメータ探索など。
  3. メモリ効率が良い: 必要なデータだけを順次処理できる。

これからの Python コーディングでぜひ活用してください!

上部へスクロール