Python反向遍历切片如何包含i=0的首元素,实现字符串每3位反转?
问题原因
你遇到的切片逻辑不一致是Python的负数索引解析规则导致的:
- 切片
[start:stop:step]的核心规则是:沿step的方向迭代,直到当前索引越过stop的位置就停止,且stop位置的元素不会被包含。 - 当
i=0时,i-1 = -1,Python中负数索引会被转换为总长度 + 负数索引的正索引,也就是对应整个字符串的最后一个元素的位置。此时步长为-1(向左迭代),起始位置是i+2=2,要向左走到远大于2的最后一个元素索引位置,完全不可能,所以直接返回空字符串,这就是前三个字符缺失的原因。 - 正向遍历中
[:i+1]的逻辑能成立,是因为此时步长为正(向右迭代),i+1的位置一定在当前起始位置的右侧,不会出现方向相反的问题。
更简洁的实现方案
方案1:条件判断适配边界场景
仅对i=0的情况单独设置stop为None(步长为负时,stop为None代表迭代到字符串最开头):
for i in range(0, len(string), 3): print(string[i+2 : i-1 if i else None : -1], end='')
方案2:通用无判断切片写法
利用小于最小索引的负数作为stop,无需判断i的值,自动适配所有场景:
for i in range(0, len(string), 3): print(string[i+2 : i - len(string) - 1 : -1], end='')
这个写法的原理是:当i>0时,i - len(string) -1会被转换为正索引i-1,刚好符合你的原有逻辑;当i=0时,这个值小于字符串的最小负索引,Python会识别为stop在字符串开头左侧,会一直迭代到第一个元素。
关于现有写法的说明
你当前用的string[i:i+3][::-1]可读性更高,即使是不熟悉切片特殊规则的开发者也能一眼看懂,性能上和一步切片几乎没有差异,完全可以正常使用。
内容的提问来源于stack exchange,提问作者ZwiTrader
相关产品推荐
相关产品推荐

