编写一个函数,它需要两个整数列表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说
列表索引超出范围
但我反复检查了一遍,我想不是。
6条答案
按热度按时间qnakjoqk1#
您的代码中有一些内容需要更新:
(1) 将此格式
mergelist = [a[i], b[i]]
更改为mergelist.append((a[i], b[i]))
(2) 当len(a)==len(b)
(3) 列表索引超出范围,因为列表索引以零开头。例如,如果len(a)为2,则范围内允许的索引将仅为0和1。所以2超出范围。
请尝试以下代码:
输出:
k5hmc34c2#
你可以用
zip()
来解决这个问题但如果某些列表比另一个列表长2项或更多项,则此函数将不起作用
am46iovg3#
具有相同功能的更短变体:
输出:
bd1hkmkf4#
我不确定您在条件语句中尝试使用for循环做什么,根据经验,我们尽量避免使用循环,尽管有时确实不可避免。
所以,你的代码在这里中断了b[len(b)],因为索引从0开始。让我们举一个例子,你有b=[5,6],5(索引0),6(索引1)&len(b)=2。你明白为什么不能这样做吗?大错特错,我们都去过那里:)
我建议的解决方案:
有几点,我真的建议您开始使用zip()函数,非常有用,特别是对于您的用例。此外,列表理解比for循环更有效,它们对于任何用例都非常方便。最后,遵循DRY(Don’t Repeat Yourself)原则,我试图不重复自己,因此创建了一个额外的函数,它对您的两个条件(len(a)>len(b)&len(b)>len(a))执行相同的操作。
我希望这有帮助。
4nkexdtk5#
此解决方案经过了合理优化,因为它没有在内存中扩展
a
和b
。dced5bon6#
有人能告诉我为什么我的代码错了吗
b[len(b)]
导致问题。改用b[-1]
。怎么样
或