2021年7月3日土曜日

【標準ライブラリ】itertoolsによる順列・組合せの作成

標準ライブラリitertoolsを用いると要素の組み合わせが作成できる。

ライブラリitertoolsを使う際にはimportが必要。

import itertools


1. productによる要素の積(デカルト積)の作成

productは集合と集合のデカルト積(直積)を求める。
productproductの戻り値はイテレータオブジェクトなので組み合わせパターンを求めるにはlistでリスト化する。

import itertools

x = ['A','B','C']
y = [1, 2]
list(itertools.product(x, y))

実行結果

[('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1), ('C', 2)]


イテレータオブジェクト自身とのデカルト積を求める場合は引数repeatを指定する。itertools.product(x, repeat=2)とした場合はitertools.product(x, x)と同じ。順序も区別したすべての組み合わせが求められる。

import itertools

x = ['A','B','C']
list(itertools.product(x, repeat=2))

実行結果

[('A', 'A'),
 ('A', 'B'),
 ('A', 'C'),
 ('B', 'A'),
 ('B', 'B'),
 ('B', 'C'),
 ('C', 'A'),
 ('C', 'B'),
 ('C', 'C')]


repeat=3の場合。

import itertools

x = ['A','B','C']
list(itertools.product(x, repeat=3))

実行結果

[('A', 'A', 'A'),
 ('A', 'A', 'B'),
 ('A', 'A', 'C'),
 ('A', 'B', 'A'),
 ('A', 'B', 'B'),
 ('A', 'B', 'C'),
 ('A', 'C', 'A'),
 ('A', 'C', 'B'),
 ('A', 'C', 'C'),
 ('B', 'A', 'A'),
 ('B', 'A', 'B'),
 ('B', 'A', 'C'),
 ('B', 'B', 'A'),
 ('B', 'B', 'B'),
 ('B', 'B', 'C'),
 ('B', 'C', 'A'),
 ('B', 'C', 'B'),
 ('B', 'C', 'C'),
 ('C', 'A', 'A'),
 ('C', 'A', 'B'),
 ('C', 'A', 'C'),
 ('C', 'B', 'A'),
 ('C', 'B', 'B'),
 ('C', 'B', 'C'),
 ('C', 'C', 'A'),
 ('C', 'C', 'B'),
 ('C', 'C', 'C')]


2. permutationsによる順列の作成

permutationsにより順列が求まる。順列を求める集合(リストなど)と選ぶ個数を指定する。選ぶ個数の指定が無ければ、集合の全ての要素で順列が作られる。

import itertools

x = ['A','B','C']
list(itertools.permutations(x))

実行結果

[('A', 'B', 'C'),
 ('A', 'C', 'B'),
 ('B', 'A', 'C'),
 ('B', 'C', 'A'),
 ('C', 'A', 'B'),
 ('C', 'B', 'A')]


要素数を指定すれば指定した要素数の順列が求まる。
要素数3のリストから2つの要素からなる順列を作る場合。

import itertools

x = ['A','B','C']
list(itertools.permutations(x, 2))

実行結果

[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]


3. combinationsによる重複しない組み合わせ作成

combinationsにより集合から重複の無い組み合わせを作成する。要素数の指定が必要。
要素数3のリストから2つの要素の重複の無い組み合わせを作る場合。

import itertools

x = ['A','B','C']
list(itertools.combinations(x, 2))

実行結果

[('A', 'B'), ('A', 'C'), ('B', 'C')]


4. combinations_with_replacementによる重複を許容する組み合わせ作成

combinations_with_replacementは同じ要素の重複を許容して、指定した要素数の組み合わせを作成する。順序は区別されない。

import itertools

x = ['A','B','C']
list(itertools.combinations_with_replacement(x, 2))

実行結果

[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]


5. リファレンス

Python 標準ライブラリ > itertools --- 効率的なループ実行のためのイテレータ生成関数

使用バージョン:Python 3.7.0

0 件のコメント:

コメントを投稿