Pythonで文字や数字の並び替えや組み合わせ(結合)をする色々な方法を解説する

スポンサーリンク

今回は、Pythonを使った順列と組み合わせの求め方を学習します。

Pythonにはitertoolsというライブラリがあり、順列と組合せを計算する関数が組み込まれています。

早速、これらの関数の実装を見てみましょう。

スポンサーリンク

必要なライブラリのインポート

以下の関数を使用する前に、itertools ライブラリをインポートする必要がある。

これは以下の方法で行います。

import itertools

上記のステートメントは、ライブラリをインポートし、その関数を使用するための経路を形成します。

順列を求める

並べ換えとは、数学的には「ある数字や文字の並び方」のことです。

itertoolsライブラリのpermutations()` 関数はまさにそれを行うものです。

1. Pythonの文字列の並べ換え

Python の文字列が与えられて、その文字がどのように配置されるかをすべて調べろと言われたら、 permutations() 関数を使えば簡単にその課題を達成することができます

import itertools
 
st = "ABC"
 
per = itertools.permutations(st)
 
for val in per:
    print(*val)

結果は以下の通りです。

A B C
A C B
B A C
B C A
C A B
C B A

関数 permutations() は String を引数にとり、itertools オブジェクトを提供します。

変数 'per' を直接表示しようとすると、以下のようになります。

<itertools.permutations object at 0x7fc9abdd8308>

したがって、各エントリを表示するためにループを実行する必要があります。

2. 複数の数値の並べ換え

Permuatations()` 関数は反復可能な引数を取るので、数字の並べ換えを調べるには、数字をリスト、セット、またはタプルとして渡す必要がある。

import itertools
 
values = [1, 2, 3]
 
per = itertools.permutations(values)
 
for val in per:
    print(*val)

結果は以下の通りです。

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

上記の並べ換えの計算手法では、すべての数字や文字を含んでいる。

順列の要素数を制限することも可能です。

3. ある要素数での並べ換え

nのうちr個の要素を並べる」というnPrの概念と同様に、要素の集合の後に整数を渡すことで実現できる。

import itertools
 
values = [1, 2, 3, 4]
 
per = itertools.permutations(values, 2)
 
for val in per:
    print(*val)

結果は、以下の通りになります。

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3

上のコードでは、permutations()`関数に、与えられた数値のリストから一度に2つの要素だけを並べるように依頼しています。

組み合わせを見つける

Combinations という用語は、オブジェクトのセットから要素をピックアップする方法を指します。

itertoolsライブラリは、まさにこの機能を実現するためにcombinations()` というメソッドを提供しています。

ここで注意しなければならないのは、オブジェクトの集合を選ぶことは、並べることを伴わないということです。

combinations()`関数は2つの引数を取ります。

  1. 値の集合
  2. 組み合わせのために選択される値の数を示す整数。

1. 単語中の文字の組合せ

ある単語が与えられたとき、その単語からちょうど2文字を含むすべての組み合わせを見つける必要があるならば、 combinations() が最適な関数です。

import itertools
 
st = "ABCDE"
 
com = itertools.combinations(st, 2)
 
for val in com:
    print(*val)

結果は、以下の通りになります。

A B
A C
A D
A E
B C
B D
B E
C D
C E
D E

2. 数字の集合の組合せ

単語中の文字の組み合わせと同様に、リスト中の数字の組み合わせも可能です。

import itertools
 
values = [1, 2, 3, 4]
 
com = itertools.combinations(values, 2)
 
for val in com:
    print(*val)

結果は、以下の通りになります。

1 2
1 3
1 4
2 3
2 4
3 4

注:生成される組み合わせは、各オブジェクトのインデックス値に基づいており、実際の値ではないので、値が繰り返される場合、この関数は、各値が異なると考える類似の組み合わせを表示します。

3. 繰り返される数字に対する組み合わせ

上記のNoteをさらに説明するために、例題を実行してみましょう。

import itertools
 
values = [1, 1, 2, 2]
 
com = itertools.combinations(values, 2)
 
for val in com:
    print(*val)

結果を出力すると、以下の様になります。

1 1
1 2
1 2
1 2
1 2
2 2

結果は、リスト中の数字が繰り返されているので、自明です。

4. 数字とそれ自身の組み合わせ

itertoolsライブラリには、並べ換えと組み合わせに関連する別の関数として、combinations_with_replacement()という関数が用意されている。

この関数はcombinations()` 関数を変形したものであるが、少し違うのは、自分自身との組み合わせも含むことです。

import itertools
 
values = [1, 2, 3, 4]
 
com = itertools.combinations_with_replacement(values, 2)
 
for val in com:
    print(*val)

結果は以下の通りです。

1 1
1 2
1 3
1 4
2 2
2 3
2 4
3 3
3 4
4 4

上の出力と、同じパラメータを持つ combinations() 関数に渡された出力は、明らかに異なることがわかります。

数字とそれ自身との組み合わせが、リストの中に複数存在するようなものです。

これは、リストから要素を選ぶと、それ自身との組み合わせを得るために、上の関数が同じ値を再び置くからです。

以上、Pythonを使った順列と組み合わせの話題をまとめました。

まとめ

順列と組み合わせの応用は、数学の分野では広大です。

このチュートリアルで説明した方法は、このような数学的手法に関する問題を解決するときに便利です。

我々は、この記事が簡単に従うことを願っています。

質問と提案のために以下にコメントすること自由に感じなさい。

タイトルとURLをコピーしました