求助:如何用for循环完整实现Python的zip(*iterables)函数?
实现自定义的zip(*iterables)函数
我看你现在的代码只能拿到每个列表的第一个元素,问题出在内层循环的break上——它直接终止了内层循环,所以你只能取到每个列表的第0个元素,而且还只是把元素挨个塞进结果列表,没有打包成元组。咱们一步步来修复这个问题,还原zip函数的核心逻辑。
先明确zip的核心逻辑
zip函数的工作方式是:
- 找到所有输入可迭代对象中最短的那个长度,以此作为循环的总次数
- 每一轮循环,取出所有输入对象在当前索引位置的元素,打包成一个元组
- 把所有元组收集起来返回(Python原生zip返回迭代器,这里咱们先实现返回列表的版本,逻辑是一致的)
修正后的代码
def custom_zip(input_list): # 先处理空输入的情况 if not input_list: return [] # 找到最短列表的长度,这是我们要循环的次数 min_length = min(len(lst) for lst in input_list) returned_list = [] # 遍历每个索引位置,从0到min_length-1 for index in range(min_length): # 收集所有列表在当前索引的元素,打包成元组 current_tuple = tuple(lst[index] for lst in input_list) returned_list.append(current_tuple) return returned_list
代码解释
- 处理空输入:如果传入的输入列表是空的(比如
custom_zip([])),直接返回空列表,避免后续报错 - 确定循环次数:用
min(len(lst) for lst in input_list)拿到所有子列表中最短的长度,这是因为zip会以最短的可迭代对象为准,长的多出来的元素会被忽略 - 遍历每个索引:从0开始到最短长度-1,每一轮处理一个位置的元素
- 打包元组:用生成器表达式
(lst[index] for lst in input_list)取出每个子列表当前索引的元素,转成元组后添加到结果列表里
测试你的示例输入
test_input = [[2,3,4], [5,6,7], [8,9,10]] print(custom_zip(test_input)) # 输出:[(2, 5, 8), (3, 6, 9), (4, 7, 10)]
额外优化:模拟原生zip的迭代器返回
如果你想更贴近原生zip的行为(返回迭代器而不是列表),可以把函数改成生成器版本:
def custom_zip_iter(input_list): if not input_list: return min_length = min(len(lst) for lst in input_list) for index in range(min_length): yield tuple(lst[index] for lst in input_list) # 使用方式 test_input = [[2,3,4], [5,6,7], [8,9,10]] for item in custom_zip_iter(test_input): print(item) # 依次输出:(2, 5, 8)、(3, 6, 9)、(4, 7, 10)
内容的提问来源于stack exchange,提问作者Anonymous Person
相关产品推荐
相关产品推荐

