Python字符串奇偶位大小写转换函数末尾索引处理失效问题
问题现象
实现奇偶位置字符大小写转换的Python函数myfunc,规则为奇数位字符转小写、偶数位字符转大写,初始实现代码如下:
def myfunc(word): new_word = '' for let in word: if (word.index(let) + 1) % 2 == 0: new_word += let.upper() elif (word.index(let) + 1) % 2 == 1: new_word += let.lower() return new_word
函数运行时前半段字符处理正常,但最后4-5个索引位置的字符转换结果异常:传入参数'Anthropomorphism'调用时,实际输出为aNtHrOpOmOrpHIsm,与预期输出aNtHrOpOmOrPhIsM不符。
根因定位
问题出在索引获取逻辑:str.index(char)方法的返回值是传入字符在字符串中第一次出现的索引,并非当前遍历到的字符的真实位置索引。
当字符串中存在重复字符时(例如测试用例Anthropomorphism中多次出现o/m/p/h等重复字符),遍历到后半段的重复字符时,word.index(let)拿到的是该字符首次出现位置的索引,和当前遍历位置的真实索引不一致,直接导致奇偶位置判断错误,最终输出不符合预期。
对应测试用例的典型错误点:
- 后半段的
h首次出现在索引3(对应第4位,偶数位需转大写),但它的真实遍历位置是索引12(对应第13位,奇数位需转小写),错误的索引取值导致该字符被错误转为大写H - 末尾的
m首次出现在索引8(对应第9位,奇数位需转小写),但它的真实遍历位置是索引15(对应第16位,偶数位需转大写),错误的索引取值导致该字符被错误转为小写m
修复方法
遍历字符串时直接同步获取每个字符的真实索引即可,推荐用enumerate()实现,代码简洁可读性强:
def myfunc(word): new_word = '' # 遍历同时获取字符的真实索引(从0开始计数)和字符本身 for idx, let in enumerate(word): if (idx + 1) % 2 == 0: new_word += let.upper() else: new_word += let.lower() return new_word
修复后传入'Anthropomorphism'测试,返回结果为aNtHrOpOmOrPhIsM,完全符合预期。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

