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

📌 应用

  • 多文件数据合并
  • 表格数据导入导出
  • 数据清洗与转换
  • 批量赋值与结构化处理

🧩 拓展练习(动手实践)

  1. 编写程序,将两个列表合并成一个字典,并过滤掉长度不一致的部分。
  2. 输入三个列表(学号、姓名、成绩),使用 zip() 打印格式化的学生信息表。
  3. 使用 zip() 实现一个二维列表的行列转置(矩阵转置)。
  4. 编写脚本,读取两个文本文件,逐行比较并输出相同行数。
  5. 实现一个程序,接收用户输入的多个字段名和值,使用 zip() 构建 JSON 对象。

📚 推荐阅读


🧭 下一步建议

  • 下一章学习内容:《Python3 字符串格式化详解》
  • 掌握 str.format()f-string、模板字符串等格式化方式
  • 学习字符串拼接、替换、正则表达式等高级操作
  • 探索字符串在日志记录、网络请求、数据解析中的应用
  • 结合 zip() 与字符串知识,尝试编写高效的文本处理工具

如果你希望我为你提供:

  • zip() 函数速查表 PDF(含示例)
  • 更多实战项目练习题(如表格转置、成绩管理系统、JSON 构建器等)
  • zip() 高级技巧详解(如与 map()filter()itertools 配合使用)
  • 视频教学资源推荐(中文讲解)

欢迎随时告诉我 😊

posted @ 2025-05-28 20:25  红尘过客2022  阅读(66)  评论(0)    收藏  举报