【问题标题】:Finding all combinations of vowel replacements查找元音替换的所有组合
【发布时间】:2012-11-07 23:57:26
【问题描述】:

我试图找到一个单词中所有元音的所有可能组合。所以例如给定'你好':

[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

有人有什么建议吗?

【问题讨论】:

  • if arr is None: a = [] 应该是 if arr is None: arr = []。这是一个错字还是你的问题?

标签: python string list combinations


【解决方案1】:

一旦 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))

【讨论】:

  • 只要你没有遇到递归限制 ;-)
  • 如果这是一个现实世界的问题,我不会担心递归深度(这是元音的数量 + 1,除非我弄错了)而不是内存使用......有一个包含一百个元音的单词,这完全在 Python 的递归限制之内,但会返回一个大小约为 10^60 TB 的列表:-)
  • 说得好。我承认。 (显然,我没有像你那样仔细考虑我的评论。+1 为你的努力:)
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多