Python类Merge Sort实现两列表交集 第23行报IndexError求助
错误原因与修复方案
报错根因
触发IndexError: list assignment index out of range的直接原因是列表赋值逻辑错误:
- 你初始化的
output是长度为0的空列表,Python中对列表执行list[index] = value赋值时,要求index必须是列表已存在的合法索引,空列表不存在任何有效索引位置,因此第一次执行下标赋值时就会触发越界。 - 本次运行时流程第一次走到了处理
rightList[j]的else分支,所以报错定位到第23行;如果流程第一次走到if分支给leftList[i]赋值,会触发完全相同的越界错误,和取哪个列表的元素无关。
另外你当前实现的逻辑和初始需求存在偏差:你写的「比较两个有序列表当前元素、取较小值存入结果」是归并两个有序列表的逻辑,不是求两个列表交集的逻辑——交集只保留两个列表同时存在的元素,不需要把所有元素都存入结果。
修复方案
根据你的实际需求二选一即可:
方案1:实现归并两个有序列表(匹配你当前写的注释逻辑)
把所有output[k] = xxx的下标赋值替换为output.append(xxx)即可,append方法会自动把元素追加到列表末尾,列表长度自动增长,不需要额外维护k变量记录写入位置,也不会出现索引越界。
修正后代码:
leftList = [int(x) for x in input().split()] rightList = [int(x) for x in input().split()] output = [] leftList.sort() rightList.sort() i = j = 0 while i < len(leftList) and j < len(rightList): if leftList[i] <= rightList[j]: output.append(leftList[i]) i += 1 else: output.append(rightList[j]) j += 1 # 追加其中一个列表剩余未遍历的元素 while i < len(leftList): output.append(leftList[i]) i += 1 while j < len(rightList): output.append(rightList[j]) j += 1 print(output)
方案2:实现求两个列表交集(匹配你最开始提到的需求)
调整双指针判断逻辑:只有当两个指针指向的元素相等时,才把元素加入结果,同时移动两个指针;元素不等时,只移动指向较小元素的指针(较小值不可能在另一个列表中存在匹配项),不需要往结果中写入值。
修正后代码:
leftList = [int(x) for x in input().split()] rightList = [int(x) for x in input().split()] output = [] leftList.sort() rightList.sort() i = j = 0 while i < len(leftList) and j < len(rightList): if leftList[i] == rightList[j]: output.append(leftList[i]) i += 1 j += 1 elif leftList[i] < rightList[j]: i += 1 else: j += 1 print(output)
内容的提问来源于stack exchange,提问作者theaveragejoe101
相关产品推荐
相关产品推荐

