Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Zip 函数

以下是一份 最全面、最清晰的 Python zip 函数知识整理,涵盖原理、用法、进阶技巧、陷阱、优化方案以及实战示例。

1️⃣ 基本语法

zip(*iterables)

作用:把多个可迭代对象“拉链式”配对,返回一个惰性的 zip 对象(迭代器)

示例:

a = [1, 2, 3]
b = ['a', 'b', 'c']

list(zip(a, b)) 
# [(1, 'a'), (2, 'b'), (3, 'c')]

2️⃣ zip 是惰性的(iterator)

zip() 本质上是 迭代器,不会一次性把数据装载到内存中。

z = zip(a, b)
next(z)  
# (1, 'a')

3️⃣ zip 会以最短序列为准(重要行为)

a = [1, 2, 3]
b = ['x', 'y']

list(zip(a, b))
# [(1, 'x'), (2, 'y')]

只走到 最短的 iterable

如果你需要补全,请用 itertools.zip_longest。

4️⃣ 与 zip_longest 对比

from itertools import zip_longest

list(zip_longest([1,2,3], ['a'], fillvalue=None))

输出:

[(1, 'a'), (2, None), (3, None)]

5️⃣ zip 常见用法大全(20个示例)

5.1 遍历多个序列(最常用)

for x, y in zip(nums, names):
    print(x, y)

5.2 构造 dict(Key-Value 配对)

keys = ['name', 'age', 'addr']
values = ['Tom', 20, 'HZ']

d = dict(zip(keys, values))

5.3 解压(反压缩)技巧 zip(*)

pairs = [(1, 'a'), (2, 'b'), (3, 'c')]
nums, letters = zip(*pairs)

# nums = (1, 2, 3)
# letters = ('a', 'b', 'c')

5.4 同步排序多个序列(经典技巧)

按照成绩排序学生和课程:

students = ["Alice", "Bob", "Cindy"]
scores = [90, 70, 85]

# 组合成 [(90, Alice), (70, Bob), ...]
sorted_students = [s for _, s in sorted(zip(scores, students))]

5.5 转置矩阵(非常常见)

matrix = [
    [1, 2, 3],
    [4, 5, 6],
]

list(zip(*matrix))
# [(1,4), (2,5), (3,6)]

即把行 -> 列。

5.6 合并多个可迭代结果(map, filter, generator)

squares = (x*x for x in range(3))
cubes   = (x**3 for x in range(3))

list(zip(squares, cubes))

zip 非常适合合并生成器。

5.7 使用 zip 与 enumerate 组合

for idx, (x, y) in enumerate(zip(a, b)):
    print(idx, x, y)

5.8 遍历 JSON 数组中的多字段

users = [
    {"name": "Tom", "age": 18},
    {"name": "Lucy", "age": 20},
]

names, ages = zip(*[(u["name"], u["age"]) for u in users])

5.9 多列表合并成 CSV 行

rows = zip(name_list, age_list, city_list)
for r in rows:
    print(','.join(map(str, r)))

5.10 与 map 组合处理多序列

result = list(map(sum, zip([1,2,3], [4,5,6])))
# [5,7,9]

5.11 分批处理 Stream / 列表

如果你要把列表每 N 个打包:

def chunk(iterable, n):
    args = [iter(iterable)] * n
    return zip(*args)

list(chunk([1,2,3,4,5,6], 3))
# [(1,2,3), (4,5,6)]

这是 zip 的高级技巧!

5.12 zip 结合 reduce 求列的累加

from functools import reduce

matrix = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
]

col_sum = [sum(col) for col in zip(*matrix)]

5.13 比较两个序列是否元素对应相等

all(x == y for x, y in zip(a, b))

5.14 zip 多序列并行进度条(配进度条场景)

可以用在 tqdm 中:

for a, b in zip(data1, data2):
    ...

5.15 将二维数组写成 CSV(py 保佑)

with open('data.csv','w') as f:
    for row in zip(*columns):
        f.write(','.join(map(str, row)) + '\n')

6️⃣ zip 的常见坑点

❌ 6.1 zip 对象是一次性的(迭代器)

z = zip(a, b)
list(z)
list(z)  # 第二次是空

务必注意。

❌ 6.2 zip 会截断到最短序列

如果你以为 zip 会补齐,那你应该用:

zip_longest

7️⃣ zip 的性能

zip 的性能非常高:

  • 无拷贝
  • 惰性
  • C 实现
  • 内存极省

在你要“并行遍历多个序列”时优先使用 zip。

8️⃣ zip 底层原理(简版源码解释)

实际上 zip 的工作方式等价于:

def py_zip(*iterables):
    iters = [iter(it) for it in iterables]
    while True:
        try:
            yield tuple(next(it) for it in iters)
        except StopIteration:
            return

9️⃣ 总结(一句话记住 zip)

zip = 多序列并行迭代;以最短为准;惰性迭代器;可用于矩阵转置、生成 dict、解压、并行遍历。