在Python中, zip函数通常用来配对. 其可以接收一个或者多个可迭代对象(列表、元组、字符串等), 然后将他们对应下标的元素打包成一个个元组.
# 实例
names = ["Alice", "Bob", "Charlie"]
ages = [20,18,22]
zipped = zip(names, ages) # 返回迭代器
print(list(zipped))
# [("Alice", 20), ("Bob", 18), ("Charlie",22)]
假如说zip接收的列表长度不同, 则会以长度最短的列表为基准, 把多出来的部分全部抛弃掉
list_a = [1, 2, 3, 4, 5] # 长度为 5
list_b = ['A', 'B'] # 长度为 2
print(list(zip(list_a, list_b)))
# [(1, 'A'), (2, 'B')]
如果不想让元素被抛弃, 可以用itertools.zip_longest. 它是以长度最长的列表为基准, 默认用None来填补,或者我们也可以用自己用fillvalue来填补.
另外, 我们还可以用操作符来解包.其语法为zip(*...).下面为多种应用场景.
# 1. 还原zip过的数据
pairs = [("Alice", 20), ("Bob", 18), ("Charlie",22)]
names, ages = zip(*pairs)
print(names)
# ("Alice", "Bob", "Charlie")
print(ages)
# (20, 18, 22)
# 2. 矩阵转置
# 按列提取转化为行
matrix = [
[1, 2, 3], # 第一行
[4, 5, 6], # 第二行
[7, 8, 9] # 第三行
]
transposed = list(zip(*matrix))
print(transposed)
# [(1, 4, 7),
# (2, 5, 8),
# (3, 6, 9)]
总而言之, zip通常有三大经典场景:
1.并行遍历 2.快速创建字典 3.列表切块
# 列表切块
cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
# 把一维列表按每 4 个一组切分开
chunked = zip(*[iter(cards)] * 4)
for row in chunked:
print(row)
# (1, 2, 3, 4)
# (5, 6, 7, 8)
# (9, 10, 11, 12)
# (13, 14, 15, 16)