Python zip 函数
上次修改时间:2025 年 4 月 11 日
这份全面的指南探讨了 Python 的 zip 函数,该函数将多个可迭代对象中的元素组合在一起。我们将介绍基本用法、并行迭代以及数据转换和组合的实际示例。
基本定义
zip 函数聚合来自多个可迭代对象的元素,并返回一个元组的迭代器。每个元组包含来自输入可迭代对象的对应元素。
主要特点:当最短的输入被耗尽时停止,在 Python 3 中返回迭代器(在 Python 2 中返回列表),并且适用于任何可迭代类型(列表、元组、字符串等)。
基本并行迭代
这是一个简单的用法示例,展示了 zip 如何配对来自两个列表的元素。这是并行迭代最常见的用例。
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 可以与两个以上的可迭代对象一起使用。此示例展示了如何将三个列表组合成三个元素的元组。
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 停止。此示例展示了它如何处理不同长度的输入。
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 通常用于从键和值的并行列表中创建字典。此示例演示了这个常见模式。
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 = [
[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 如何将行转换为列。* 运算符将矩阵行解包为单独的参数。
每个原始列都成为结果中的一个元组。此技术适用于方形和矩形矩阵。
最佳实践
- 用于并行迭代: 非常适合一起处理多个序列
- 优先于索引: 比 range(len()) 模式更具可读性
- 处理不等长度: 请注意它在最短的序列处停止,或者使用 zip_longest
- 与 dict 结合使用: 从并行列表创建字典的简洁方法
- 考虑内存: 在 Python 3 中,zip 返回一个迭代器(内存高效)
资料来源
作者
列出所有 Python 教程。