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

