2022年04月13日 更新

多重ループで作る総当たりリストをPythonで簡単に書く

どうも、クラゲジュニアです。
例えば、3つのアイテムがあって、それぞれ持っていくか持っていかないかを検討したいときに、すべての組み合わせを配列で出したいとします。

例えば「ゲーム機」「本」「お菓子」があったとして、(1, 0, 1) は「ゲーム機」と「お菓子」を持っていくという意味です。

forを使ってネストで書いた場合

patterns = []

for n2 in range(2):
  for n1 in range(2):
    for n0 in range(2):
      patterns.append((n2, n1, n0))

print(patterns)

# 出力結果
# [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

例えばアイテムが増えたら、さらにfor文や変数nを追加する必要があります。

itertoolsを使って書いた場合

2行で書けます。

import itertools
patterns = list(itertools.product(range(2), repeat=3))

print(patterns)

# 出力結果
# [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

アイテムが増えたらrepeat3の数値を変えるだけでOK。

参考:https://docs.python.org/ja/3/library/itertools.html

以上です。