不使用zip函数通过递归交替合并两个不同长度Python列表
递归交替合并不等长列表问题解答
原代码存在的核心问题
你写的代码主要有三个问题导致无法得到正确的列表结果:
- 判断顺序逻辑错误:你把
两个列表同时为空的判断放在了单个列表为空的判断之后,当前面的len(l1) == 0或者len(l2) == 0触发时,永远不会走到同时为空的分支,且你给同时为空的分支返回的是数字0,不符合列表返回要求。 - 递归切片逻辑错误:
l1[1:0]是空切片,完全没有实现切掉第一个元素递归的逻辑,且递归分支的设计不符合交替取两个列表首元素的要求。 - 拼接规则错误:你直接用
l2[0] + 递归返回值是数字加法操作,不是列表拼接,自然无法得到列表格式的结果。
问题1:判断顺序是否会影响运行结果?
会,且影响极大。递归的终止条件必须遵循「先判断更极端的小范围边界,再判断大范围边界」的规则,你原来的写法里,len(l1) == 0 and len(l2) == 0是len(l1) == 0的子集,放在后面永远不会被触发,导致逻辑完全错误。
正确递归实现代码
def zippa(l1, l2): # 优先判断两个列表都为空的终止条件,返回空列表保证返回格式统一 if len(l1) == 0 and len(l2) == 0: return [] # 第一个列表为空,直接返回剩下的第二个列表即可 elif len(l1) == 0: return l2 # 第二个列表为空,直接返回剩下的第一个列表即可 elif len(l2) == 0: return l1 # 两个列表都有值,取各自首元素拼成列表,拼接剩下元素的递归结果 else: return [l1[0], l2[0]] + zippa(l1[1:], l2[1:])
执行print(zippa([1, 3, 5], [2, 4, 6, 8, 10]))即可得到预期输出[1, 2, 3, 4, 5, 6, 8, 10]。
逻辑说明
所有分支的返回值都是列表类型,全程用列表+操作拼接结果,自然最终返回列表格式:
- 终止边界返回空列表,作为递归拼接的终点
- 单个列表为空时直接返回剩余非空列表,不需要额外递归迭代
- 非终止状态每次各取两个列表的第一个元素,交替放入结果,再递归处理两个列表剩下的部分
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

