Pythonで順列と組み合わせを求める方法|itertoolsモジュールの使い方を徹底解説
この記事では、Pythonを使ってシーケンス(リストや文字列など)から順列(permutation)と組み合わせ(combination)を求める方法を解説します。
Pythonが他のプログラミング言語と比べて大きなアドバンテージを持っている点の一つは、豊富な標準ライブラリが最初から付属していることです。順列と組み合わせの計算も、Pythonに組み込まれているitertoolsパッケージを使えば、追加インストールなしで簡単に実現できます。
順列・組み合わせを求める基本的な手順
itertoolsを使った処理は、大きく次の3ステップで行います。
ステップ1:必要なパッケージをインポートする
まず、使用するパッケージをインポートします。ここではitertoolsを使うので、以下のようにインポートします。
>>> import itertools >>>
ステップ2:シーケンスを渡して順列・組み合わせを取得する
次に、対象となるリストやシーケンスを入力として渡します。すると、すべての順列・組み合わせが「タプルのリスト」形式で返されます。
また、第2引数で長さを指定することで、特定の要素数の順列・組み合わせだけを取り出すことも可能です。
ステップ3:結果を出力する
最後に、forループなどを使って結果を1つずつ表示します。
順列(permutations)の求め方
まずは、3つの要素を持つリストの順列を求めてみましょう。
例1:すべての順列を取得する
from itertools import permutations
seq = permutations(['a','b','c'])
for p in list(seq):
print(p)実行結果
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')3つの要素の並べ替えは全部で6通り(3! = 6)生成されていることがわかります。
例2:順列の長さを指定する
第2引数に数値を渡すと、その長さの順列だけを取得できます。以下の例では、6文字のリストから長さ2の順列を取り出しています。
from itertools import permutations
seq = permutations(['p', 'y', 't', 'h', 'o', 'n'], 2)
for p in list(seq):
print(p)実行結果
('p', 'y')
('p', 't')
('p', 'h')
('p', 'o')
('p', 'n')
('y', 'p')
('y', 't')
('y', 'h')
('y', 'o')
('y', 'n')
('t', 'p')
('t', 'y')
('t', 'h')
('t', 'o')
('t', 'n')
('h', 'p')
('h', 'y')
('h', 't')
('h', 'o')
('h', 'n')
('o', 'p')
('o', 'y')
('o', 't')
('o', 'h')
('o', 'n')
('n', 'p')
('n', 'y')
('n', 't')
('n', 'h')
('n', 'o')順列では「順序が異なるものは別の並び」として扱われるため、('p', 'y') と ('y', 'p') は別々の結果として出力されます。
組み合わせ(combinations)の求め方
続いて、組み合わせの求め方を見ていきましょう。
例1:長さを指定して組み合わせを取得する
# itertoolsパッケージをインポート
from itertools import combinations
# 特定の長さの組み合わせをすべて取得
combi = combinations(['p', 'y', 't', 'h', 'o', 'n'], 5)
# 組み合わせのリストを表示
for c in list(combi):
print(c)実行結果
('p', 'y', 't', 'h', 'o')
('p', 'y', 't', 'h', 'n')
('p', 'y', 't', 'o', 'n')
('p', 'y', 'h', 'o', 'n')
('p', 't', 'h', 'o', 'n')
('y', 't', 'h', 'o', 'n')組み合わせでは順序を考慮しないため、('p', 'y') と ('y', 'p') は同じものとして扱われます。そのため、順列よりも結果の数が少なくなります。
例2:重複を許可する組み合わせ(combinations_with_replacement)
同じ要素を繰り返し選んでよい場合は、combinations_with_replacementを使用します。
# itertoolsパッケージをインポート
from itertools import combinations_with_replacement
# 長さを指定して重複ありの組み合わせを取得
combi = combinations_with_replacement(['p', 'y', 't', 'h', 'o', 'n'], 2)
# 組み合わせのリストを表示
for c in list(combi):
print(c)実行結果
('p', 'p')
('p', 'y')
('p', 't')
('p', 'h')
('p', 'o')
('p', 'n')
('y', 'y')
('y', 't')
('y', 'h')
('y', 'o')
('y', 'n')
('t', 't')
('t', 'h')
('t', 'o')
('t', 'n')
('h', 'h')
('h', 'o')
('h', 'n')
('o', 'o')
('o', 'n')
('n', 'n')('p', 'p') のように同じ文字のペアも含まれている点が、通常のcombinationsとの違いです。
まとめ
- 順列:
itertools.permutations()— 順序を考慮した並べ替えをすべて取得 - 組み合わせ:
itertools.combinations()— 順序を考慮しない組合せを取得 - 重複ありの組み合わせ:
itertools.combinations_with_replacement()— 同一要素の再選択を許可
これらの関数はイテレータを返すため、大量のデータを扱う場合でもメモリ効率よく処理できます。リスト化したい場合はlist()で変換しましょう。数学的な問題の解法や、パスワード候補の生成、テストケースの網羅など、さまざまな場面で活用できる便利な機能です。
-
C++で組み合わせと順列を計算する方法をわかりやすく解説
組み合わせと順列とは組み合わせ(Combination)と順列(Permutation)は、数学の一分野である組合せ論(Combinatorics)に属する概念です。順列とは、n個の要素の中から、1つずつ・いくつかずつ・あるいはすべてを一度に取り出して並べるときの、異なる並び方の総数のことです。並べる順序が結果に影響する点が特徴です。一方、組み合わせとは、同じくn個の要素から1つずつ・いくつかずつ・すべてを取り出して選ぶときの、異なる選び方の総数です。順序は考慮されないため、順列よりも数が少なくなります。計算式順列の数n個の要素全体からr個の要素を並べるときの順列の数は、次の公式で求められます
-
Pythonで学ぶ相関と回帰分析の基礎|Seabornを使ったデータ分析入門
相関(Correlation)とは、2つのデータセット間に存在する依存関係を含む統計的な関係性を指します。一方、線形回帰(Linear Regression)は、従属変数と1つ以上の独立変数の間の関係を直線的なアプローチで捉える手法です。独立変数が1つの場合は「単回帰」、複数ある場合は「重回帰」と呼ばれます。相関とは何か依存現象の身近な例としては、親と子の身体的特徴(外見)の類似性や、商品の価格と供給量の関係などが挙げられます。価格が上がれば供給量が増える、といった具合に、変数同士が互いに影響し合う様子を統計的に表したものが相関です。本記事では、Pythonの可視化ライブラリ「Seaborn」