扩展 - zip() 函数用法解释
1 课程概览
本课扩展讲解 Python 内置 zip() 函数的用法。zip() 将多个可迭代对象的对应元素打包成元组,常与 * 解包配合使用。本课为 n-gram 特征处理做铺垫,后续将使用 zip(*sliced_list) 组合滑动窗口切片。
2 核心概念与定义
- zip() 函数:Python 内置函数,将多个可迭代对象的对应元素打包成元组,返回 zip 对象(迭代器)。
*解包(Unpacking):将列表/元组解包为单独的参数传递给函数。
3 模型与算法详解
zip() 函数语法
zip(*iterables)
- iterables:多个可迭代对象
- 返回值:zip 对象(迭代器),包含元组
zip() 基本用法
# 基本用法:对应元素打包
list(zip([1, 2, 3], ['a', 'b', 'c']))
# [(1, 'a'), (2, 'b'), (3, 'c')]
zip(*) 解包用法
# * 解包:将列表的列表解包为多个参数
sliced_list = [[1, 3, 5], [2, 4, 6]]
list(zip(*sliced_list))
# [(1, 2), (3, 4), (5, 6)]
zip() 在 n-gram 中的应用
# 滑动窗口切片
input_list = [1, 3, 2, 1, 5, 3]
n_gram = 2
# 切片
sliced_list = [input_list[i:] for i in range(n_gram)]
# [[1, 3, 2, 1, 5, 3], [3, 2, 1, 5, 3]]
# zip(*) 组合
n_gram_tuples = list(zip(*sliced_list))
# [(1, 3), (3, 2), (2, 1), (1, 5), (5, 3)]
zip() 特性
| 特性 | 说明 |
|---|---|
| 返回类型 | zip 对象(迭代器) |
| 惰性求值 | 创建时不立即遍历 |
| 最短长度 | 以最短的可迭代对象为准 |
| 一次性 | 迭代完毕后再次迭代无数据 |
4 数学原理与推导
zip() 打包关系
给定可迭代对象 $A = [a_1, a_2, ..., a_n]$ 和 $B = [b_1, b_2, ..., b_n]$:
$$\text{zip}(A, B) = [(a_1, b_1), (a_2, b_2), ..., (a_n, b_n)]$$
zip(*) 解包关系
给定列表的列表 $L = [[a_1, a_2, ..., a_n], [b_1, b_2, ..., b_n]]$:
$$\text{zip}(*L) = [(a_1, b_1), (a_2, b_2), ..., (a_n, b_n)]$$
5 代码示例
# 需求:演示 zip 函数的用法
def dm01_zip():
# 1. 基本用法:对应元素打包
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
result = list(zip(list1, list2))
print("基本用法:", result)
# [(1, 'a'), (2, 'b'), (3, 'c')]
# 2. * 解包用法
sliced_list = [[1, 3, 5], [2, 4, 6]]
result = list(zip(*sliced_list))
print("解包用法:", result)
# [(1, 2), (3, 4), (5, 6)]
# 3. n-gram 应用
input_list = [1, 3, 2, 1, 5, 3]
n_gram = 2
# 滑动窗口切片
sliced_list = [input_list[i:] for i in range(n_gram)]
print("切片:", sliced_list)
# [[1, 3, 2, 1, 5, 3], [3, 2, 1, 5, 3]]
# zip(*) 组合
n_gram_tuples = list(zip(*sliced_list))
print("n-gram:", n_gram_tuples)
# [(1, 3), (3, 2), (2, 1), (1, 5), (5, 3)]
# 测试
if __name__ == "__main__":
dm01_zip()
6 重难点与易错提醒
- ❗重点:
zip(*iterables)将对应元素打包成元组。 - ❗重点:
zip(*list_of_lists)解包后组合,用于 n-gram 特征生成。 - ⚠️易错:zip 返回迭代器,需用
list()转换查看结果。 - ⚠️易错:zip 以最短的可迭代对象为准,长的部分会被截断。
- 💡深入理解:
zip(*)是zip的逆操作,可用于解压。
7 课堂问答精选
Q1:zip() 函数的作用是什么?
A:将多个可迭代对象的对应元素打包成元组。例如 zip([1,2], ['a','b']) 返回 [(1,'a'), (2,'b')]。
Q2:zip(*) 解包的作用是什么?
A:将列表的列表解包为多个参数传给 zip。例如 zip(*[[1,3,5], [2,4,6]]) 返回 [(1,2), (3,4), (5,6)]。
Q3:zip() 在 n-gram 中如何使用?
A:先用滑动窗口切片 sliced_list = [input_list[i:] for i in range(n_gram)],再用 zip(*sliced_list) 组合相邻元素。
8 本课小结
zip(*iterables)将对应元素打包成元组。zip(*list_of_lists)解包后组合,用于 n-gram。- 返回迭代器,需用
list()转换。 - 以最短可迭代对象为准。
- 为 n-gram 特征处理做铺垫。
9 延伸思考
- 如何用 zip() 实现矩阵转置?
- zip() 和 itertools.zip_longest() 有什么区别?