Python报IndexError: list index out of range错误,求原因及解决方法
错误原因
- 把元素值当成索引使用:
for i in a循环里的i是a列表中的元素(比如a是[5,6],i就是5、6),你用a[i]相当于取a列表第5个索引的元素,而a的长度只有2,索引最大是1,直接越界触发IndexError。 - 错误赋值pop的返回值:
a = a.pop(i)完全错误,pop()方法返回的是被删除的单个元素,执行后a会变成一个整数,后续再操作a肯定出问题,正确写法是直接a.pop(index),不需要赋值给a。 - 遍历原列表时修改它:循环过程中删除列表元素会导致列表长度变化,后面的元素前移,循环会跳过部分元素,逻辑彻底混乱。
- 后续代码的低级错误:
len(a[i])里的a[i]是整数,整数没有len()属性,这行代码执行也会报错。
解决方法
- 先找交集元素:把其中一个列表转成集合,快速找出两个列表的共同元素(集合查找时间复杂度是O(1))。
- 生成新列表而非修改原列表:用列表推导式生成移除共同元素后的新列表,避免遍历原列表时修改导致的问题。
- 修正m的计算逻辑:原代码的m计算逻辑混乱,假设需求是移除共同元素后,统计两个列表对应位置元素不同的数量,以及长度差异部分每个元素算1次(比如a比b长2个元素,就加2),调整循环逻辑即可。
修正后的代码
for _ in range(int(input())): n = int(input()) a = list(map(int, input().split())) b = list(map(int, input().split())) # 找出两个列表的交集元素(去重) common = set(a) & set(b) # 生成移除共同元素后的新列表 new_a = [num for num in a if num not in common] new_b = [num for num in b if num not in common] m = 0 # 先统计对应位置不同的数量 for x, y in zip(new_a, new_b): if x != y: m += 1 # 再统计长度差异的部分,每个额外元素算1次 m += abs(len(new_a) - len(new_b)) print(m)
额外说明
如果需求是移除成对出现的共同元素(比如a里有一个2,b里有一个2,就各删一个;a里有两个2,b里有一个2,就删a的一个2和b的一个2),用计数器处理更合适:
from collections import Counter for _ in range(int(input())): n = int(input()) a = list(map(int, input().split())) b = list(map(int, input().split())) cnt_a = Counter(a) cnt_b = Counter(b) # 生成移除成对共同元素后的新列表 new_a = [] for num in a: if cnt_a[num] > 0 and cnt_b.get(num, 0) > 0: cnt_a[num] -= 1 cnt_b[num] -= 1 else: new_a.append(num) new_b = [] for num in b: if cnt_b[num] > 0: new_b.append(num) # 计算m的逻辑和之前一致 m = 0 for x, y in zip(new_a, new_b): if x != y: m += 1 m += abs(len(new_a) - len(new_b)) print(m)
内容的提问来源于stack exchange,提问作者kenj
相关产品推荐
相关产品推荐

