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

Python merge函数实现遇列表索引越界错误,求问题原因及修正

问题排查:merge函数索引越界错误

需求描述

编写一个merge函数,接收两个整数列表a和b作为参数,返回一个新列表。函数需按索引合并两列表的元素为元组并放入新列表;若其中一个列表比另一个短,需重复较短列表的最后元素以补全长度;若任一列表为空,则返回空列表。

示例

merge([0, 1, 2], [5, 6, 7]) # should return [(0, 5), (1, 6), (2, 7)]
merge([2, 1, 0], [5, 6])    # should return [(2, 5), (1, 6), (0, 6)]
merge([], [2, 3])           # should return []

本人尝试代码

def merge(a, b):
    if len(a) == 0 or len(b) == 0:
        mergelist = []
    elif len(a) > len(b):
        for i in range(0, len(b)):
            mergelist = [a[i], b[i]]
        for i in range(len(b), len(a)):
            mergelist = [a[i], b[len(b)]]
    elif len(b) > len(a):
        for i in range(0, len(a)):
            mergelist = [a[i], b[i]]
        for i in range(len(a), len(b)):
            mergelist = [a[len(a)], b[i]]

    return mergelist

print(merge([0, 1, 2], [5, 6]))

错误原因分析

  1. 索引越界直接原因:列表索引从0开始,长度为n的列表最后一个元素的索引是n-1。代码中使用b[len(b)]、a[len(a)],这两个索引都超出了列表的有效范围,必然触发IndexError。比如b长度为2时,有效索引是0和1,len(b)为2,访问b[2]就会报错。
  2. 结果列表赋值错误:每次循环直接把mergelist赋值为单个[a[i], b[i]],而非用append方法往列表中添加元素,最终mergelist只会保留最后一次循环的结果,完全不符合需求。
  3. 分支遗漏:当两个列表长度相等时,代码没有对应的处理分支,此时mergelist未定义,会触发NameError。

修复后的代码

def merge(a, b):
    if not a or not b:
        return []
    max_len = max(len(a), len(b))
    result = []
    for i in range(max_len):
        # 获取a的元素:i在范围内取a[i],否则取最后一个元素
        elem_a = a[i] if i < len(a) else a[-1]
        # 获取b的元素:同理
        elem_b = b[i] if i < len(b) else b[-1]
        result.append((elem_a, elem_b))
    return result

# 测试示例
print(merge([0, 1, 2], [5, 6, 7]))  # [(0, 5), (1, 6), (2, 7)]
print(merge([2, 1, 0], [5, 6]))     # [(2, 5), (1, 6), (0, 6)]
print(merge([], [2, 3]))            # []

内容的提问来源于stack exchange,提问作者Jerry Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:15:55