替换字符串中的所有元音 - 返回而非打印

0 投票
2 回答
1707 浏览
提问于 2025-04-18 04:58

我想写一个函数,这个函数接收一个字符串,然后把里面的每个元音字母(像a、e、i、o、u)替换成它自己连续出现的多个副本。

def replace(word):
    for c in word:
        if c in 'aeiouAEIOU':
            return word.replace(c, c*5)

我写的代码只对第一个元音字母进行了替换,然后就停止了。我猜这是因为我用了“return”而不是“print”。不过,我的作业对“返回”或“打印”函数的要求很明确——这个作业要求“返回”一个新的字符串。

2 个回答

1

使用列表:

def replace(word):
    newword=[]
    for c in word:
        if c.lower() in 'aeiou':
            newword.append(c*5)
        else:
            newword.append(c)
    return ''.join(newword)

或者用字符串替换

def vowelreplace(word):
    vowels='aeiouAEIOU'
    for c in vowels:
        word=word.replace(c, c*5)
    return word

用列表推导式是最简单的方法:

def vowelreplace(word):
    return ''.join([i*5 if i in 'aeiouAEIOU' else i for i in word])
2

这里有两个主要问题:

  1. 你在找到第一个元音字母后就立刻返回了结果。

  2. 你想在遍历单词的时候改变它。

因为在Python中,字符串是不可变的,也就是说一旦创建就不能直接修改,所以每次你想改变字符串时,都需要创建一个新的字符串。对于这个特定的情况,我们可以用列表推导式来创建一个新的字符列表,然后把这些字符合并在一起,最终构造出一个新的字符串,像这样:

def replace(word):
    return "".join([c * 5 if c in 'aeiouAEIOU' else c for c in word])

assert replace("a")  == "aaaaa"
assert replace("ab") == "aaaaab"
assert replace("B")  == "B"

这个程序会从单词中逐个取出字符,使用 for c in word,然后检查 if c in 'aeiouAEIOU'。如果这个条件成立,就把当前列表的元素变成 c * 5,也就是把元音字母重复五次;如果不成立,就保持当前元素为 c 本身。所以在合并之前,列表看起来会像这样,对于单词 Welcome

def replace(word):
    print [c * 5 if c in 'aeiouAEIOU' else c for c in word]
    return "".join([c * 5 if c in 'aeiouAEIOU' else c for c in word])

replace("Welcome")
# ['W', 'eeeee', 'l', 'c', 'ooooo', 'm', 'eeeee']

然后我们用 "".join 把它们合并在一起,得到 Weeeeelcooooomeeeee

你可以把这个程序稍微通用化一下,像这样:

def replace(word, count):
    return "".join([c * count if c in 'aeiouAEIOU' else c for c in word])

assert replace("Welcome", 2) == "Weelcoomee"
assert replace("Welcome", 3) == "Weeelcooomeee"

撰写回答