如何使用for循环实现Python的zip(*iterables)函数?功能实现遇阻
自定义实现Python的
zip(*iterables)函数 嘿,我懂你想手动复刻zip(*iterables)的需求啦!先聊聊你现有代码的问题:你在内部循环里加了break,这直接导致每个子列表只取了第一个元素(j=0的时候就跳出循环了),而且是把所有元素平铺到一个列表里,既没按原生zip那样打包成元组,也没处理后续的第n个元素。
那咱们一步步把它改对:
核心逻辑先理清楚
原生zip(*iterables)的工作方式是:
- 先找到所有输入可迭代对象里最短的那个长度(因为
zip会在最短的对象耗尽时停止) - 对每个位置
n(从0到最短长度-1),依次从每个输入对象里取出第n个元素,把这些元素打包成一个元组 - 最后把所有元组收集起来返回
改进后的代码实现
def my_zip(*input_lists): # 先处理空输入的边界情况 if not input_lists: return [] # 找到所有输入列表中最短的长度 min_length = min(len(lst) for lst in input_lists) returned_list = [] # 遍历每个位置n for n in range(min_length): # 收集当前位置的所有元素,打包成元组 current_tuple = tuple(lst[n] for lst in input_lists) returned_list.append(current_tuple) return returned_list
用你的示例测试看看
拿你给的[[2,3,4], [5,6,7], [8,9,10]]来测试:
test_input = [[2,3,4], [5,6,7], [8,9,10]] print(my_zip(*test_input)) # 输出:[(2, 5, 8), (3, 6, 9), (4, 7, 10)]
这和原生zip(*test_input)转成列表后的结果完全一致。
进阶:模拟原生zip的迭代器特性(可选)
如果你想更贴近原生zip返回迭代器的特性,可以把函数改成生成器版本,这样更节省内存:
def my_zip_generator(*input_lists): if not input_lists: return min_length = min(len(lst) for lst in input_lists) for n in range(min_length): yield tuple(lst[n] for lst in input_lists)
使用的时候转成列表即可:list(my_zip_generator(*test_input)),效果和上面一样。
内容的提问来源于stack exchange,提问作者Anonymous Person
相关产品推荐
相关产品推荐

