ZetCode

Python zip 函数

上次修改时间:2025 年 4 月 11 日

这份全面的指南探讨了 Python 的 zip 函数,该函数将多个可迭代对象中的元素组合在一起。我们将介绍基本用法、并行迭代以及数据转换和组合的实际示例。

基本定义

zip 函数聚合来自多个可迭代对象的元素,并返回一个元组的迭代器。每个元组包含来自输入可迭代对象的对应元素。

主要特点:当最短的输入被耗尽时停止,在 Python 3 中返回迭代器(在 Python 2 中返回列表),并且适用于任何可迭代类型(列表、元组、字符串等)。

基本并行迭代

这是一个简单的用法示例,展示了 zip 如何配对来自两个列表的元素。这是并行迭代最常见的用例。

basic_zip.py
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]

# Zip creates pairs of corresponding elements
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")

# Output:
# Alice is 25 years old
# Bob is 30 years old
# Charlie is 35 years old

此示例演示了 zip 如何按位置组合来自两个列表的元素。循环迭代对应元素的对。

zip 的结果是一个迭代器,它生成元组,直到最短的输入被耗尽。这可以防止长度不等的索引错误。

组合多个可迭代对象

zip 可以与两个以上的可迭代对象一起使用。此示例展示了如何将三个列表组合成三个元素的元组。

multi_zip.py
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
departments = ['HR', 'Engineering', 'Marketing']

# Combining three iterables
for person in zip(names, ages, departments):
    print(person)

# Output:
# ('Alice', 25, 'HR')
# ('Bob', 30, 'Engineering')
# ('Charlie', 35, 'Marketing')

这演示了 zip 处理多个输入可迭代对象的能力。每个生成的元组包含来自该位置所有输入的元素。

该函数对于不同数量的输入保持一致,始终创建具有与提供的输入可迭代对象一样多元素的元组。

处理不等长度

当最短的可迭代对象被耗尽时,zip 停止。此示例展示了它如何处理不同长度的输入。

unequal_lengths.py
long_list = [1, 2, 3, 4, 5]
short_list = ['a', 'b', 'c']

# Zip stops at shortest iterable
result = list(zip(long_list, short_list))
print(result)  # [(1, 'a'), (2, 'b'), (3, 'c')]

这显示了 zip 在具有不等长度的输入时的行为。超出最短可迭代对象长度的元素将被忽略,而不会出错。

对于希望包含所有元素的情况,请考虑使用标准库中的 itertools.zip_longest

字典创建

zip 通常用于从键和值的并行列表中创建字典。此示例演示了这个常见模式。

dict_creation.py
keys = ['name', 'age', 'job']
values = ['Alice', 25, 'Engineer']

# Create dictionary from zipped keys and values
person = dict(zip(keys, values))
print(person)
# Output: {'name': 'Alice', 'age': 25, 'job': 'Engineer'}

这显示了 zip 如何配对键和值,然后 dict 使用它来构造字典。这是一种构建映射的简洁方法。

该模式有效,因为 zip 生成 (key, value) 对的元组,这正是 dict 期望作为输入的内容。

矩阵转置

当与解包运算符 (*) 结合使用时,zip 可以转置矩阵(列表的列表)。此示例演示了矩阵操作。

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

# Transpose rows and columns
transposed = list(zip(*matrix))
print(transposed)
# Output: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

这种高级用法展示了带有解包的 zip 如何将行转换为列。* 运算符将矩阵行解包为单独的参数。

每个原始列都成为结果中的一个元组。此技术适用于方形和矩形矩阵。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程