プログラムを組むうえで、全パターン網羅が必要になることがあります。
(私はpaizaのスキルチェックで必要になりました)
ここでは、全パターン網羅する方法について説明します。
全パターン網羅するには、itertools
モジュールのcombinations
関数を使います。
まずは list から決められた個数を選んだ時の全パターン網羅について、
具体的なコードを使って説明します。
# itertools を import
import itertools
test_list = ["a", "b", "c", "d", "e", "f"]
all_pattern = []
# test_list から2個選んだ場合の全パターン検索
for pattern in itertools.combinations(test_list, 2):
all_pattern.append(pattern)
print("test_list から2個選んだ場合の全パターン数 -> ", len(all_pattern))
print(all_pattern)
print()
all_pattern = []
# test_list から3個選んだ場合の全パターン検索
for pattern in itertools.combinations(test_list, 3):
all_pattern.append(pattern)
print("test_list から3個選んだ場合の全パターン数 -> ", len(all_pattern))
print(all_pattern)
test_list から2個を選んだ場合の全パターン、3個を選んだ場合の全パターンについて
それぞれ個数と、実際のパターンを出力しています。
結果はこちら。
test_list から2個選んだ場合の全パターン数 -> 15
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('a', 'e'), ('a', 'f'), ('b', 'c'), ('b', 'd'), ('b', 'e'), ('b', 'f'), ('c', 'd'), ('c', 'e'), ('c', 'f'), ('d', 'e'), ('d', 'f'), ('e', 'f')]
test_list から3個選んだ場合の全パターン数 -> 20
[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'b', 'f'), ('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'c', 'f'), ('a', 'd', 'e'), ('a', 'd', 'f'), ('a', 'e', 'f'), ('b', 'c', 'd'), ('b', 'c', 'e'), ('b', 'c', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('b', 'e', 'f'), ('c', 'd', 'e'), ('c', 'd', 'f'), ('c', 'e', 'f'), ('d', 'e', 'f')]
続いて、上記を少し応用し、選ぶ個数も含めて全パターン網羅するにはどうするか?を考えます。
上記の例だとtest_list = ["a", "b", "c", "d", "e", "f"]
の中から、
1個を選んだ場合の全パターン、2個を選んだ場合の全パターン、3個を選んだ場合の全パターン、
・・・、6個を選んだ場合の全パターンの全てを網羅することを考えます。
具体的なコードを使って説明します。
import itertools
test_list = ["a", "b", "c", "d", "e", "f"]
all_pattern = []
# test_list から選べる全パターン検索
for i in range(1, len(test_list)+1):
for pattern in itertools.combinations(test_list, i):
all_pattern.append(pattern)
print("test_list から選べる全パターン数 -> ", len(all_pattern))
print(all_pattern)
「list から何個選ぶのか」という部分を、
for
文で「1~全個数」まで指定することで全パターン検索しています。
結果はこちら。
test_list から選べる全パターン数 -> 63
[('a',), ('b',), ('c',), ('d',), ('e',), ('f',), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('a', 'e'), ('a', 'f'), ('b', 'c'), ('b', 'd'), ('b', 'e'), ('b', 'f'), ('c', 'd'), ('c', 'e'), ('c', 'f'), ('d', 'e'), ('d', 'f'), ('e', 'f'), ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'b', 'f'), ('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'c', 'f'), ('a', 'd', 'e'), ('a', 'd', 'f'), ('a', 'e', 'f'), ('b', 'c', 'd'), ('b', 'c', 'e'), ('b', 'c', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('b', 'e', 'f'), ('c', 'd', 'e'), ('c', 'd', 'f'), ('c', 'e', 'f'), ('d', 'e', 'f'), ('a', 'b', 'c', 'd'), ('a', 'b', 'c', 'e'), ('a', 'b', 'c', 'f'), ('a', 'b', 'd', 'e'), ('a', 'b', 'd', 'f'), ('a', 'b', 'e', 'f'), ('a', 'c', 'd', 'e'), ('a', 'c', 'd', 'f'), ('a', 'c', 'e', 'f'), ('a', 'd', 'e', 'f'), ('b', 'c', 'd', 'e'), ('b', 'c', 'd', 'f'), ('b', 'c', 'e', 'f'), ('b', 'd', 'e', 'f'), ('c', 'd', 'e', 'f'), ('a', 'b', 'c', 'd', 'e'), ('a', 'b', 'c', 'd', 'f'), ('a', 'b', 'c', 'e', 'f'), ('a', 'b', 'd', 'e', 'f'), ('a', 'c', 'd', 'e', 'f'), ('b', 'c', 'd', 'e', 'f'), ('a', 'b', 'c', 'd', 'e', 'f')]