You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:35