如何在 Python 中使用 zip() 函数(组合可迭代对象)
了解如何使用 Python 的 zip() 函数并行组合多个可迭代对象。掌握字典创建、解压缩逻辑以及处理长度不匹配。
概述
迭代数据集时,您通常需要并行处理多个相关列表。例如,将用户名列表与用户 ID 列表配对,或者匹配 X 和 Y 值的坐标。 Python 提供了优雅的“zip()”函数,而不是嵌套循环或使用列表索引计数器访问项目。
`zip(*iterables)` 函数接受多个可迭代对象作为参数并聚合它们,返回一个元组迭代器,其中第 i 个元组包含每个输入可迭代对象中的第 i 个元素。这使您可以使用单个“for”循环轻松地同时循环两个或多个集合。
默认情况下,当最短的输入迭代用尽时,“zip()”停止组合。较长迭代中的任何剩余元素都将被丢弃。如果您想对元素进行配对,直到最长的可迭代对象耗尽,并用占位符填充缺失值,Python 在标准库的“itertools”模块中提供了“zip_longest()”。
代码和执行输出
此脚本演示了并行列表迭代、使用 zip 创建字典以及使用 zip_longest 处理不匹配。
zip_function.py
在编辑器中尝试from itertools import zip_longest
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]
# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
print(f"{name} scored {score}")
# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)
# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]
# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))
# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)端子输出
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95
Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}
Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]逐步实施
- 将要组合的多个列表或可迭代对象传递给 zip() 函数。
- 将生成的元组解压到 for 循环语句中,以实现干净的并行迭代。
- 使用 dict(zip(keys_list, value_list)) 将 zip 对象转换为字典进行映射。
- 导入 itertools.zip_longest 以组合不等长的列表,而不会丢失尾部值。
常见问题解答
如何“解压缩”压缩的元组序列?
您可以使用解包运算符 *:list(zip(*zipped_tuples)) 将序列解压缩回单独的列表。
zip() 是否复制内存中的元素?
不,zip() 返回一个可按需生成元素的迭代器,从而使其具有极高的内存效率。
相关主题
推荐的 Python 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。