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 教程。