Python 3.6出现IndexError: list index out of range,请求排查代码问题
你的代码问题分析&修复方案
嘿,咱们来看看你这段代码为啥报错哈~
首先,你输入123456的时候,原字符串长度是6,你写的for i in range(0, len(realpair))会让循环跑6次,但每次循环里你都会从rp列表里pop(0)两次——也就是每次循环消耗俩元素。咱们数一下:
- 第1次循环后,rp从
['1','2','3','4','5','6']变成['3','4','5','6'] - 第2次循环后,rp变成
['5','6'] - 第3次循环后,rp直接空了
- 第4次循环的时候,rp已经啥都没有了,你还想取
rp[0],这不就触发IndexError了嘛!
另外还有个小细节:你每次循环都直接硬取前两个元素,完全没考虑如果输入长度是奇数的情况(比如输入12345),不过这次报错主要是循环次数不对导致的。
修复后的几种写法
写法1:直接调整循环次数(最贴合你的需求)
既然要每两个元素一组,那循环次数应该是原长度的一半呀,改成range(len(rp)//2)就行:
realpair = input("") realpairfinal = [] rp = list(realpair) # 只循环成对的次数,比如6个元素就循环3次 for i in range(len(rp) // 2): v1 = rp.pop(0) v2 = rp.pop(0) # 如果需要把字符转成数字,就改成int(v1)、int(v2) realpairfinal.append([v1, v2]) print(realpairfinal)
输入123456的话,输出就是[['1', '2'], ['3', '4'], ['5', '6']],完美符合你的期望~
写法2:用while循环更灵活(兼容奇数长度输入)
要是想让代码能处理像12345这种奇数长度的输入(最后保留单个元素),可以用while循环:
realpair = input("") realpairfinal = [] rp = list(realpair) # 只要rp里还有元素就继续循环 while rp: v1 = rp.pop(0) # 还有元素就取第二个,没有就设成None(或者你想留空也可以) v2 = rp.pop(0) if rp else None # 根据有没有v2来决定加哪种列表 realpairfinal.append([v1, v2] if v2 is not None else [v1]) print(realpairfinal)
输入12345的话,输出会是[['1', '2'], ['3', '4'], ['5']],鲁棒性更强。
写法3:用切片更高效(推荐!)
其实pop(0)在列表里效率挺低的,因为列表是动态数组,删开头元素得移动后面所有元素。如果输入很长的话,用切片处理会更高效,代码也更简洁:
realpair = input("") realpairfinal = [] # 步长设为2,每次取i到i+2的切片 for i in range(0, len(realpair), 2): # 切片自动处理越界情况,比如最后一次如果是奇数长度,只取到末尾 pair = list(realpair[i:i+2]) # 转数字的话改成[int(c) for c in pair] realpairfinal.append(pair) print(realpairfinal)
这种写法不用修改原列表,跑起来更快,也更清爽~
对了,你代码里的pair = realpairfinal和pair2 = realpairfinal其实没啥用,它们只是指向同一个列表的引用,要是后续不用这俩变量,直接删掉就行啦。
内容的提问来源于stack exchange,提问作者Visonge
相关产品推荐
相关产品推荐

