

５文字のアルファベットでできた単語が並んだ（１語ずつ改行）テキストファイルがあります。別に与えられたｎ文字(5<=n)のアルファベットに含まれている文字を並び替えて作成できる５文字の単語が、テキストファイルの中に何個あるか調べよ、という問題です。  
※並び替えの際、与えられたn個の文字は１度ずつ使えるものとします。

'abcdee'という文字列が与えられたと仮定します。  
この６文字から５文字を選ぶ組み合わせ（順列）は７２０通りです。この７２０通りの組み合わせの内、テキストファイルに登場する単語はいくつかを答えます。

まずは正しく７２０通りの組み合わせリストを作りたいのですが、現在のコードでは２４０通りしか出てきません。ところが、仮定の文字列を一文字だけ変えて'abcdef'とし、'e'の重複を解消すると、正しく７２０通り表示されます。このことから原因は、二つの'e'をうまく区別させることができていないためだと考えています。  
ここまでわかったのですが、いかにして'abcdee'のままで７２０通り表示させるかを考えて、スタックしています。ご教示お願いします。

python, jupyternotebook ともに最新のバージョンです。

[code]

    s = 'abcdee'
    word = ''
    anagrams = []
    
    def perms(letters, word, anagrams):
        if len(word) == 5:
            anagrams.append(word)
        else:
            for i in letters:
                new_word = word + i
                new_letters = letters.replace(i, '')
                perms(new_letters, new_word, anagrams)
        return anagrams
    
    print(len(perms(letters, word, anagrams)))
    
[/code]


CC BY-SA 4.0
2022-12-08T01:16:56.823
92631
2023-05-31T14:38:48.630
2023-05-31T14:38:48.630
8000
question
python
全ての組み合わせのリストを作成したい


[`itertools.permutations`](https://docs.python.org/ja/3/library/itertools.html#itertools.permutations)を使うことで順列を取得できます。

[code]

    import itertools
    anagramlist = [''.join(x) for x in itertools.permutations('abcdee')]
    print(len(anagramlist)) # 720
    
[/code]

なおリビジョン3の質問では`abcdee`となっていますが、リビジョン1では`caatro`となっていました。  
画像でソースコードを添付されていて、いかなるimportも禁止でした。

下記はその内容に沿った回答となっています。

* * *

コメントと重複しますが若干解説を加えて回答します。

`new_s = s.replace(i, '')`で文字列`i`と同一の文字を消去してしまっているのが原因です。  
(例えば`'caatro'.replace('a', '')` を実行すると 'ctro' が返ります)  
文字の置換回数を1回だけに抑えたい場合は`replace`関数の第三引数に`1`を設定してください。

[code]

    new_s = s.replace(i, '')   # 修正前
    new_s = s.replace(i, '', 1) # 修正後
    
[/code]

**サンプルコード**

[code]

    s = 'caatro'
    word = ''
    anagramlist = []
    
    def perm_s(s, word, anagramlist):
        if len(word) == 5:
            anagramlist.append(word)
        else:
            for i in s:
                new_word = word + i
                #new_s = s.replace(i, '')   # 修正前
                new_s = s.replace(i, '', 1) # 修正後
                perm_s(new_s, new_word, anagramlist)
        return anagramlist
    
    print(len(perm_s(s, word, anagramlist)))
    
[/code]

参考資料:

  * 公式リファレンス[組み込み型#`str.replace`](https://docs.python.org/ja/3/library/stdtypes.html?highlight=str%20replace#str.replace)
  * [Pythonで文字列を置換する：replace(), re.sub()](https://uxmilk.jp/8662)


CC BY-SA 4.0
2022-12-08T02:13:47.067
92632
2022-12-28T01:19:38.887
2022-12-28T01:19:38.887
9820
9820
92631
answer