在 Python 中,zip() 是一个功能强大的内置函数,用于将多个可迭代对象中的元素按索引位置组合成元组,从而形成新的迭代器。它常用于配对、合并、并行遍历等操作,是处理多个数据序列的利器。

zip() 这个名字形象地说明了它的功能:把多个序列“咬合”在一起,像拉链(zipper)那样逐项配对。

一、函数语法

zip(iterable1, iterable2, ..., iterableN)

参数:

iterable1, iterable2, ..., iterableN:一个或多个可迭代对象(如列表、元组、字符串、range 等)。个数不限,但结果中只保留最短可迭代对象的长度对应的元素。

返回值:

返回一个迭代器对象(zip 类型),每个元素是一个由传入各个可迭代对象中同索引元素组成的元组。

如果需要查看全部结果,可使用 list() 或 tuple() 将其转换为列表或元组。

二、基础用法示例

1、将两个列表打包成对

names = ['Alice', 'Bob', 'Charlie']
scores = [90, 85, 78]

for name, score in zip(names, scores):
    print(f"{name}: {score}")

输出:

Alice: 90
Bob: 85
Charlie: 78

2、zip() 返回 zip 对象,需转换为列表或元组查看结果

a = [1, 2, 3]
b = ['a', 'b', 'c']

z = zip(a, b)
print(list(z))  

# 输出: [(1, 'a'), (2, 'b'), (3, 'c')]

3、多个可迭代对象

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = ['x', 'y', 'z']

print(list(zip(a, b, c)))

# 输出:[(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]

4、 长度不一致时,按最短截断

a = [1, 2, 3]
b = ['a', 'b']

print(list(zip(a, b)))

# 输出:[(1, 'a'), (2, 'b')]   # 第 3 个元素被舍弃

三、典型应用场景

1、构建字典

keys = ['id', 'name', 'age']
values = [101, 'Alice', 18]

person = dict(zip(keys, values))
print(person)

# 输出:{'id': 101, 'name': 'Alice', 'age': 18}

2、并行遍历多个序列

students = ['Tom', 'Jerry', 'Spike']
scores = [88, 92, 75]

for name, score in zip(students, scores):
    print(f"{name}: {score}")

输出:

Tom: 88
Jerry: 92
Spike: 75

3、解包(逆操作)

使用 * 运算符可以解包已 zip 的数据。

zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 35)]
names, ages = zip(*zipped)
print(names)    # 输出: ('Alice', 'Bob', 'Charlie')
print(ages)    # 输出: (25, 30, 35)

*matrix 是解包操作符,表示将 matrix 中的每一项单独取出作为参数传入函数。

4、转置(tranpose)二维列表

matrix = [
    [1, 2, 3],
    [4, 5, 6]
]

transposed = list(zip(*matrix))
print(transposed)

# 输出:列表的行列互换
# [(1, 4), (2, 5), (3, 6)]

四、补充说明

1、zip() 返回的是惰性迭代器,不会立即生成所有结果,而是在遍历时逐个计算,适合大数据处理。

即,zip() 返回的是迭代器,只能被消费一次。

zipped = zip(names, ages)

list(zipped)  # 第一次可以正常使用
list(zipped)  # 第二次返回空列表

2、想强制“等长配对”可以使用 itertools.zip_longest(),会填补较短列表的缺失值(需要引入标准库)。

from itertools import zip_longest

a = [1, 2]
b = ['a', 'b', 'c']

print(list(zip_longest(a, b, fillvalue='-')))

# 输出:[(1, 'a'), (2, 'b'), ('-', 'c')]

3、zip() 可与 enumerate() 配合使用。

names = ['Tom', 'Jerry', 'Spike']
scores = [88, 92, 75]

for i, (n, s) in enumerate(zip(names, scores), start=1):
    print(f"第{i}位:{n}({s}分)")

4、在 Python 2 中,zip() 直接返回列表而非迭代器。

5、当处理大型数据集时,zip() 比手动索引更高效且更 Pythonic。

zip() 是 Python 中处理并行迭代的强大工具,可以使代码更简洁、更易读,特别适合需要同时处理多个相关数据序列的场景。

点赞有美意,赞赏是鼓励