Python 查找元音替换的所有组合

Python 查找元音替换的所有组合,python,string,list,combinations,Python,String,List,Combinations,我试图找到一个单词中所有元音的所有可能组合。例如,给出“你好”: [你好,你好,你好,你好,你好,你好,你好,你好,你好,你好,你好,你好…] 我已经编写了下面的函数,它将只取每个元音,在每个元音处,它将全部替换为元音,并将每个版本添加到列表中。我试着把它变成我想要的排列,但它不起作用。我尝试在追加后插入元音(“.”.join(string),arr),但这会导致无限递归 def vowels(word, arr=None): if arr is None: a = []

我试图找到一个单词中所有元音的所有可能组合。例如,给出“你好”:

[你好,你好,你好,你好,你好,你好,你好,你好,你好,你好,你好,你好…]

我已经编写了下面的函数,它将只取每个元音,在每个元音处,它将全部替换为元音,并将每个版本添加到列表中。我试着把它变成我想要的排列,但它不起作用。我尝试在追加后插入元音(“.”.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

有人有什么建议吗?

一旦所提到的输入错误被修复,您的函数将返回以下内容:

['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))

如果arr为None:a=[]
应该是
如果arr为None:arr=[]
。这是打字错误还是您的问题?前提是您没有遇到递归限制;-)如果这是一个现实世界的问题,我不会太担心递归深度(即元音的数量+1,除非我弄错了),而会担心内存的使用。。。如果有一个单词包含100个元音,这将在Python的递归限制范围内,但将返回一个大小为10^60 TB的列表:-)这是很好的说明。我承认。(显然我没有像你那样仔细考虑我的评论。+1感谢你的努力:)