编写一个函数,它需要两个整数列表 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]))
有人能告诉我为什么我的代码是错误的吗?我的 IDE 说
the list index is out of range
但我检查了一遍又一遍,我认为它不是,,,。
编辑:我没想到会有这么多人帮助我并给我他们的代码版本。他们非常乐于助人。非常感谢大家!!!
最佳答案
您的代码中有几处需要更新:
(1) 将此格式 mergelist = [a[i], b[i]]
更改为此格式 mergelist.append((a[i], b[i]) )
(2) 需要处理 len(a) == len(b) 的情况
(3) 列表索引超出范围,因为列表索引从零开始。例如,如果 len(a) 为 2,则范围内允许的索引将仅为 0 和 1。所以 2 超出了范围。
试试这段代码:
def merge(a, b):
mergelist = []
if len(a) == 0 or len(b) == 0:
return mergelist
elif len(a) >= len(b): #takes care of len(a)==len(b)
for i in range(0, len(b)):
mergelist.append((a[i], b[i]))
for i in range(len(b), len(a)):
mergelist.append((a[i], b[len(b)-1])) #index minus 1
elif len(b) > len(a):
for i in range(0, len(a)):
mergelist.append((a[i], b[i]))
for i in range(len(a), len(b)):
mergelist.append((a[len(a)-1], b[i])) #index minus 1
return mergelist
print(merge([0, 1, 2], [5, 6]))
print(merge([5, 6], [0, 1, 2]))
print(merge([0, 1, 2], [5, 6, 7])) # should return [(0, 5), (1, 6), (2, 7)]
print(merge([2, 1, 0], [5, 6])) # should return [(2, 5), (1, 6), (0, 6)]
print(merge([], [2, 3])) # should return []
输出:
[(0, 5), (1, 6), (2, 6)]
[(5, 0), (6, 1), (6, 2)]
[(0, 5), (1, 6), (2, 7)]
[(2, 5), (1, 6), (0, 6)]
[]
https://stackoverflow.com/questions/74161800/