我正在尝试为单词中的所有元音找到所有可能的组合。例如,给'hello':
[halla, halle, halli, hallo, hallu, hella, halle, halli, hallo, hallu...]
我编写了以下函数,它将只取每个元音,并且在每个元音中,它将只用元音替换它们并将每个版本添加到列表中。我试图将其改变为我想要的排列,但它不起作用。我尝试在追加后插入元音(“”。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
有人有任何建议吗?
答案 0 :(得分:2)
一旦提到的错字CristopheD被修复,你的函数就会返回:
['hallo', 'hello', 'hillo', 'hollo', 'hullo', 'hella', 'helle', 'helli', 'hello', 'hellu']
...所以它返回了一些可能的组合,但不是全部。
那是因为它依次取出单词中的每个元音,然后依次用每个元音取代它,然后转到单词中的下一个元音 - 但不考虑到前一个元音(s)当它碰到后续的时候发现它。这是一个递归解决方案,适用于具有任意数量元音的单词:
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))