Python3 zip详解
Python3 zip()
详解
🎯 学习目标
掌握 Python 内置函数 zip()
的基本用法、进阶技巧及其在数据合并、遍历多个序列、解包操作中的实际应用场景。能够在项目开发中高效使用 zip()
提升代码的可读性和性能。
🔑 核心重点
分类 | 内容 |
---|---|
基本功能 | 将多个可迭代对象按位置“压缩”成元组列表 |
解包操作 | 使用 * 和 zip() 配合实现逆向解压 |
实际应用场景 | 合并多列数据、批量赋值、字典构造、表格处理等 |
注意事项 | 输入长度不一致时以最短为准;支持任意类型组合 |
📚 详细讲解
一、什么是 zip()
?
zip()
是 Python 的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)按索引位置配对,返回一个由元组组成的迭代器。
✅ 基本语法:
zip(iterable1, iterable2, ..., iterableN)
✅ 示例:
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 22]
for name, age in zip(names, ages):
print(f"{name} 的年龄是 {age}")
📌 输出:
Alice 的年龄是 25
Bob 的年龄是 30
Charlie 的年龄是 22
二、zip()
的返回值
zip()
返回的是一个惰性求值的迭代器,不是立即生成列表。可以使用 list()
或 tuple()
转换为具体结构。
result = zip([1, 2, 3], ['a', 'b', 'c'])
print(list(result)) # [(1, 'a'), (2, 'b'), (3, 'c')]
三、多序列合并
可以同时传入多个可迭代对象,进行多列合并。
a = [1, 2, 3]
b = ['x', 'y', 'z']
c = [10, 20, 30]
for x, y, z in zip(a, b, c):
print(x, y, z)
📌 输出:
1 x 10
2 y 20
3 z 30
四、长度不一致时的行为
当输入的可迭代对象长度不一致时,zip()
会以最短的那个为准,多余部分会被忽略。
nums = [1, 2, 3, 4]
chars = ['a', 'b']
print(list(zip(nums, chars)))
# 输出:[(1, 'a'), (2, 'b')]
⚠️ 如果希望以最长为准,请使用
itertools.zip_longest()
五、与 *
运算符配合实现解包
使用 *
可以将已“zip”过的数据重新解包。
pairs = [(1, 'a'), (2, 'b'), (3, 'c')]
a, b = zip(*pairs)
print(a) # (1, 2, 3)
print(b) # ('a', 'b', 'c')
📌 应用场景:
- 拆分表格数据
- 数据转置(如矩阵行列交换)
六、构建字典(键值对合并)
当有两个等长的列表分别表示键和值时,可以直接用 zip()
构造字典。
keys = ['name', 'age', 'city']
values = ['Alice', 25, 'Beijing']
user_info = dict(zip(keys, values))
print(user_info)
# {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
七、结合 enumerate()
使用
可以在遍历时获取索引和多个元素:
names = ["Alice", "Bob", "Charlie"]
scores = [90, 85, 95]
for i, (name, score) in enumerate(zip(names, scores)):
print(f"第 {i+1} 名:{name} - 得分 {score}")
📌 输出:
第 1 名:Alice - 得分 90
第 2 名:Bob - 得分 85
第 3 名:Charlie - 得分 95
⚠️ 注意事项
- 若输入对象长度不一致,默认截断,需谨慎处理
zip()
返回的是迭代器,不是列表或元组,使用前最好转换- 不要对集合(set)使用顺序 zip,因为其无序
- 在函数参数中使用
*
解包 zip 对象时,注意变量数量匹配 zip()
是惰性求值,适合大数据量处理,节省内存
🧪 实际案例分析
📌 场景:从两个 CSV 文件中提取数据并合并输出
假设我们有两个文件:
users.csv
:用户名单scores.csv
:用户成绩
内容如下:
users.csv:
Alice
Bob
Charlie
scores.csv:
90
85
95
目标:合并输出用户姓名与对应成绩
with open('users.csv') as f1, open('scores.csv') as f2:
for name, score in zip(f1, f2):
print(f"{name.strip()} 的成绩是 {score.strip()}")
📌 输出示例:
Alice 的成绩是 90
Bob 的成绩是 85
Charlie 的成绩是 95
📌 应用:
- 多文件数据合并
- 表格数据导入导出
- 数据清洗与转换
- 批量赋值与结构化处理
🧩 拓展练习(动手实践)
- 编写程序,将两个列表合并成一个字典,并过滤掉长度不一致的部分。
- 输入三个列表(学号、姓名、成绩),使用
zip()
打印格式化的学生信息表。 - 使用
zip()
实现一个二维列表的行列转置(矩阵转置)。 - 编写脚本,读取两个文本文件,逐行比较并输出相同行数。
- 实现一个程序,接收用户输入的多个字段名和值,使用
zip()
构建 JSON 对象。
📚 推荐阅读
- Python 官方文档 - zip
- 《流畅的 Python》第 7 章 - 迭代器与生成器
- 廖雪峰 Python 教程 - 迭代
- 菜鸟教程 - Python zip 函数
- Real Python - Using the zip Function in Python
🧭 下一步建议
- 下一章学习内容:《Python3 字符串格式化详解》
- 掌握
str.format()
、f-string
、模板字符串等格式化方式 - 学习字符串拼接、替换、正则表达式等高级操作
- 探索字符串在日志记录、网络请求、数据解析中的应用
- 结合
zip()
与字符串知识,尝试编写高效的文本处理工具
如果你希望我为你提供:
zip()
函数速查表 PDF(含示例)- 更多实战项目练习题(如表格转置、成绩管理系统、JSON 构建器等)
zip()
高级技巧详解(如与map()
、filter()
、itertools
配合使用)- 视频教学资源推荐(中文讲解)
欢迎随时告诉我 😊