4

単語内のすべての母音のすべての可能な組み合わせを見つけようとしています。たとえば、「こんにちは」が与えられた場合:

[halla, halle, halli, hallo, hallu, hella, halle, halli, hallo, hallu...]

次の関数は、各母音を取得し、各母音ですべてを母音に置き換え、各バージョンをリストに追加します。私はそれを順列に変更しようとしていますが、うまくいきません。追加後に vowels("".join(string), arr) を挿入しようとしましたが、その結果、無限再帰が発生します。

def vowels(word, arr=None):
    if arr is None:
        a = []

    for i, c in enumerate(word):
        if c in 'aeiou':
            for v in 'aeiou':
                string = list(word)
                string[i] = v
                arr.append("".join(string))
    return arr

誰か提案はありますか?

4

1 に答える 1

2

上記のタイプミスCristopheDが修正されると、関数は次のように返します。

['hallo', 'hello', 'hillo', 'hollo', 'hullo', 'hella', 'helle', 'helli', 'hello', 'hellu']

...したがって、可能な組み合わせの一部が返されますが、すべてではありません。

これは、単語内の各母音を順番に取得し、それを各母音に順番に置き換えてから、単語内の次の母音に移動するためです。ただし、後続の母音に当たったときに見つかった前の母音は考慮されていません。 。これは、任意の数の母音を持つ単語に対して機能する再帰的なソリューションです。

import re

VOWELS = "aeiou"
RE_VOWEL = re.compile("[%s]" % VOWELS)

def helper(parts):
    if len(parts) == 1:
        yield parts[0]
    else:
        for vowel in VOWELS:
            for item in helper([vowel.join(parts[:2])] + parts[2:]):
                yield item

def vowels(word):
    parts = re.split(RE_VOWEL, word)
    return list(helper(parts))
于 2012-11-08T00:47:07.860 に答える