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
这里做了几个优化:
- 用
enumerate()一次遍历完成元音和索引的收集,确保每个元音的索引都是正确的 - 将元音列表改为集合,
in操作的判断速度更快(对于短字符串影响不大,是好习惯) - 反转元音列表而非索引列表,逻辑更直观:原索引位置依次替换为反转后的元音序列
内容的提问来源于stack exchange,提问作者Sifuniaris
相关产品推荐
相关产品推荐

