Pythonで組み合わせを効率的に作成したいときに役立つのが、itertools
モジュールの product
関数です。この関数を使うと、リストやタプルのすべての直積(デカルト積)を簡単に生成できます。
この記事では、itertools.product
の使い方から、実践的なユースケースや注意点までを徹底解説します!
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')]
このコードでは、リスト a
と b
の全組み合わせが生成され、タプルとしてリストに格納されます。
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
は、複数リストの全組み合わせを効率的に生成できる便利な関数です。この記事のポイントを振り返ります:
- 全組み合わせを簡単生成: ネストループを使わずにコードをシンプルに。
- 応用範囲が広い: 商品バリエーション、機械学習のハイパーパラメータ探索など。
- メモリ効率が良い: 必要なデータだけを順次処理できる。
これからの Python コーディングでぜひ活用してください!