You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:54:41