1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

プログラムを組むうえで、全パターン網羅が必要になることがあります。
(私は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')]
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?