1. ホーム
  2. python

[解決済み] Pythonで与えられた文字列のすべての可能な並べ換えを見つける

2022-10-03 06:48:04

質問

ある文字列がある。その文字列の中の文字の順番を変えて、その文字列からすべての順列を生成したい。例えば、次のようにします。

x='stack'

のようなリストが欲しいのです。

l=['stack','satck','sackt'.......]

現在、私は文字列のリストキャストを繰り返し、ランダムに2文字を選び、それらを転置して新しい文字列を形成し、それをlのセットキャストに追加しています。文字列の長さに基づき、可能な順列の数を計算し、セットのサイズが限界になるまで繰り返し処理を続けています。 これを行うためのより良い方法があるはずです。

どのように解決するのですか?

itertoolsモジュールには、permutations()という便利なメソッドがあります。 ドキュメント にはこう書かれています。

itertools.permutations(iterable[, r])

反復可能の要素の連続したr個の長さの並べ換えを返す。

rが指定されないか、またはNoneの場合、rはデフォルトで になり、すべての可能な並べ換えが生成されます。

並べ換えは辞書式ソート順で生成されます。したがって、もし入力 順で生成される。 の順で生成されます。

並べ替えられた文字を文字列として結合しなければなりませんが。

>>> from itertools import permutations
>>> perms = [''.join(p) for p in permutations('stack')]
>>> perms

['stack', 'stakc', 'stcak', 'stcka', 'stkac', 'stkca', 'satck', 'satkc', 'sactk', 'sackt', 'saktc', 'sakct', 'sctak', 'sctka', 'scatk'、'scakt'、'sckta'、'sckat'、'sktac'、'sktca'、'skatc' 'skact'、'skcta'、'skcat'、'tsack'、'tsakc'、'tscak'、'tscka'。 'tskac', 'tskca', 'tasck', 'taskc', 'tacsk', 'tacks', 'taksc', 'takcs'、'tcsak'、'tcska'、'tcask'、'tcaks'、'tcksa', 'tckas', 'tksac'、'tksca'、'tkasc'、'tkacs'、'tkcsa'、'tkcas'、 'astck' 'astkc', 'asctk', 'asckt', 'asktc', 'askct', 'atsck', 'atskc', 'atcsk', 'atcks', 'atksc', 'atkcs', 'acstk', 'acskt', 'actk', 'actks', 'ackst', 'ackts', 'akstc', 'aksct', 'aktsc', 'aktcs', 'akcst'、'akcts'、'cstak'、'cstka'、'csatk'、'csakt'、'cskta' 'cskat', 'ctsak', 'ctska', 'ctask', 'ctaks', 'ctksa', 'ctkas', 'castk', 'caskt', 'catsk', 'catks', 'cakst', 'cakts', 'cksta', 'cksat'、'cktsa'、'cktas'、'ckast'、'ckats'、 'kstac'、'kstca' 'ksatc', 'ksact', 'kscta', 'kscat', 'ktsac', 'ktsca', 'ktasc', 'ktacs', 'ktcsa', 'ktcas', 'kastc', 'kasct', 'katsc', 'katcs', 'kacst', 'kacts', 'kcsta', 'kcsat', 'kctsa', 'kctas', 'kcast', 'kcats'] です。

重複に悩まされる場合は、データを set :

>>> perms = [''.join(p) for p in permutations('stacks')]
>>> len(perms)
720
>>> len(set(perms))
360

これは伝統的に型キャストと考えられているものではなく、どちらかというと set() コンストラクタの呼び出しであるということです。