如何在 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 资源

通过相关的交互式教程、备忘单和代码比较来扩展您的知识。