Python index()方法返回位置不符合预期问题排查与解决
问题原因
str.index(sub)方法的核心逻辑是返回参数sub在字符串中第一次匹配位置的索引,不会返回当前遍历到的重复字符的实际位置。如果字符串不存在任何重复字符,原写法看似能得到正确结果,但只要存在重复字符就会出现索引匹配错误,属于不稳定的错误写法。
以测试字符串javadzamani为例,字符串中a字符重复出现多次,各位置对应关系如下:
- 索引0: j
- 索引1: a
- 索引2: v
- 索引3: a
- 索引4: d
- 索引5: z
- 索引6: a
- 索引7: m
- 索引8: a
- 索引9: n
- 索引10: i
遍历到索引3、6、8位置的a时,调用text.index('a')永远只会返回第一个a的索引1,和当前字符的真实索引完全不符,最终导致偶数索引判断逻辑失效。
另外原代码第一行末尾多写了一个多余的反引号,运行时会直接触发语法错误,需要删除。
修正方案
推荐两种符合Python编码习惯的写法:
方案1:使用enumerate()同时获取索引和字符(可读性最高)
enumerate()可以在遍历序列时同时返回当前元素的索引和值,完全规避index()的匹配问题:
text = input('Enter a text : ') # 测试可输入javadzamani查看结果 for idx, char in enumerate(text): # idx就是当前字符的真实索引 if idx % 2 == 0: print(char)
输入javadzamani时,输出结果为j、v、d、a、a、i,符合偶数索引筛选预期。
方案2:使用字符串切片(写法最简洁)
Python序列支持步长切片,text[::2]表示从索引0开始,每隔1个字符取一个值,正好对应所有偶数索引位置的字符,不需要手动写索引判断:
text = input('Enter a text : ') for char in text[::2]: print(char)
运行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者javad zamani
相关产品推荐
相关产品推荐

