【Python】itertools.permutations()で文字列から長さrの順列をすべて生成する方法
はじめに
文字列 s と数値 r が与えられたとき、s の中から r 個の文字を選んで作ることができるすべての順列(並べ方)を表示するプログラムを作成してみましょう。
Python の標準ライブラリ itertools には、順列を簡単に生成できる permutations() 関数が用意されています。この関数を活用すれば、わずか数行のコードで目的を実現できます。
入力例と出力イメージ
たとえば、入力が s = "HELLO"、r = 3 の場合、出力は次のようになります。
['HEL', 'HEL', 'HEO', 'HLE', 'HLL', 'HLO', 'HLE', 'HLL', 'HLO', 'HOE', 'HOL', 'HOL', 'EHL', 'EHL', 'EHO', 'ELH', 'ELL', 'ELO', 'ELH', 'ELL', 'ELO', 'EOH', 'EOL', 'EOL', 'LHE', 'LHL', 'LHO', 'LEH', 'LEL', 'LEO', 'LLH', 'LLE', 'LLO', 'LOH', 'LOE', 'LOL', 'LHE', 'LHL', 'LHO', 'LEH', 'LEL', 'LEO', 'LLH', 'LLE', 'LLO', 'LOH', 'LOE', 'LOL', 'OHE', 'OHL', 'OHL', 'OEH', 'OEL', 'OEL', 'OLH', 'OLE', 'OLL', 'OLH', 'OLE', 'OLL']
解決の手順
この問題は、以下のステップで解くことができます。
permutations()を使って、文字列 s から選ぶサイズ r のすべての順列をリストとして取得する- 結果を格納するための新しいリスト res を用意する
- 取得した各順列 x について、文字のタプルを
join()で連結して文字列に変換し、res に追加する - 最後に res を返す
実装例
それでは、実際のコードを見てみましょう。
from itertools import permutations
def solve(s, r):
vals = list(permutations(s, r))
res = []
for x in vals:
res.append(''.join(x))
return res
s = "HELLO"
r = 3
print(solve(s, r))
コードのポイント
permutations(s, r)は、s の中から r 個の要素を選び出すすべての並び方をタプルとして返します。- タプルのままでは扱いにくいため、
''.join(x)で各要素を連結し、1つの文字列に変換しています。 - 元の文字列に同じ文字が含まれている場合(この例では "HELLO" に L が2つ)、重複した順列もそのまま出力される点に注意してください。重複を排除したい場合は、
set()を使うか、あらかじめ文字列から重複を取り除いておきましょう。
出力結果
['HEL', 'HEL', 'HEO', 'HLE', 'HLL', 'HLO', 'HLE', 'HLL', 'HLO', 'HOE', 'HOL', 'HOL', 'EHL', 'EHL', 'EHO', 'ELH', 'ELL', 'ELO', 'ELH', 'ELL', 'ELO', 'EOH', 'EOL', 'EOL', 'LHE', 'LHL', 'LHO', 'LEH', 'LEL', 'LEO', 'LLH', 'LLE', 'LLO', 'LOH', 'LOE', 'LOL', 'LHE', 'LHL', 'LHO', 'LEH', 'LEL', 'LEO', 'LLH', 'LLE', 'LLO', 'LOH', 'LOE', 'LOL', 'OHE', 'OHL', 'OHL', 'OEH', 'OEL', 'OEL', 'OLH', 'OLE', 'OLL', 'OLH', 'OLE', 'OLL']
まとめ
itertools の permutations() 関数を使えば、文字列から指定した長さの順列を簡単にすべて生成できます。組み合わせ(順序を考慮しない)が必要な場合は combinations()、重複ありの順列が必要な場合は product() を使うとよいでしょう。用途に応じて使い分けることで、さまざまな場面で役立ちます。
-
指定された文字列のすべての順列を出力するPythonプログラム
本記事では、以下の問題に対する解決策について詳しく学んでいきます。 問題文 1つの文字列が与えられたとき、その文字列から作成できるすべての順列(並べ替えの組み合わせ)を表示する必要があります。 それでは、以下の実装例で具体的な解決策を見ていきましょう。 実装例 # リストを文字列に変換 def toString(List): return .join(List) # 順列の生成 def permute(a, l, r): if l == r: print(toString(a)) else: for i in range(l, r +
-
【Python】文字列がすべてユニークな文字で構成されているか判定する方法
本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS