You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字符串元音反转函数异常求助:重复元音输入输出错误

问题原因分析

你的代码在处理重复元音时出错,核心问题出在获取元音索引的方式:

你使用了string.index(ch)来获取当前元音字符的位置,但str.index()方法的特性是:返回该字符在字符串中第一次出现的索引。以输入'Queen'为例:

  • 字符串是Q(0), u(1), e(2), e(3), n(4),元音依次是u、e、e
  • 遍历第二个循环时,第一个e会拿到索引2,第二个e调用index('e')仍然返回2(因为这是e第一次出现的位置)
  • 最终place列表会变成[1, 2, 2],反转后是[2, 2, 1]
  • 替换时,str[2]会被先赋值为vowin[0](u),接着又被赋值为vowin[1](e),最后str[1]被赋值为vowin[2](e),导致最终结果变成Qeeen

而输入hello时,元音是e(1)和o(4),两个字符不重复,index()能正确获取各自的索引,所以结果符合预期。

修正后的代码

解决方法是遍历字符串时同时记录索引,避免使用index()方法。可以用enumerate()来实现:

vow = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}  # 用集合判断更快

def reverse_vowels(string):
    vowin = []
    place = []
    # 一次遍历同时收集元音和对应的索引
    for idx, ch in enumerate(string):
        if ch in vow:
            vowin.append(ch)
            place.append(idx)
    # 反转元音列表(不用反转索引列表,直接反过来取元音)
    vowin.reverse()
    str_list = list(string)
    for idx, pos in enumerate(place):
        str_list[pos] = vowin[idx]
    return ''.join(str_list)

print(reverse_vowels('Queen'))  # 输出 Qeeun
print(reverse_vowels('hello'))  # 输出 holle

这里做了几个优化:

  1. 用enumerate()一次遍历完成元音和索引的收集,确保每个元音的索引都是正确的
  2. 将元音列表改为集合,in操作的判断速度更快(对于短字符串影响不大,是好习惯)
  3. 反转元音列表而非索引列表,逻辑更直观:原索引位置依次替换为反转后的元音序列

内容的提问来源于stack exchange,提问作者Sifuniaris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:55:34