说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 zip() 上用来创建一个聚合了来自每个可迭代对象中的元素的迭代器。它获取 iterables(可以是零或更多),将它们聚合成多个元组形成的可迭代对象,然后返回。
Zip 在英文中是拉链、拉锁,也有拉上拉链和用拉链锁上以及使沿某方向快速移动的意思。因此非常形象地表明了它的功能,它常用于将两个及以上的列表(可迭代对象)按位置一一对应地拉在一起。
zip() 函数的语法为:
zip(*iterables)
参数 iterables 可以是一个内置的可迭代对象 (如: list, string, dict), 或者是用户自己定义的可迭代对象。简单说,就是可以传入一个或者多个(一般是两个)类似列表或者元组那样的可迭代对象,如 zip([1,2], [3,4])
等。同时,它还支持参数为空。
zip() 函数返回一个基于参数 iterable 对象的元组迭代器(zip 对象)。根据传入参数的情况,它返回的内容分别为:
针对第三种情况,如一个包含 2 个元素,另一个包含 3 个元素,则返回的迭代器将包含 2 个元组,每个元组以第一个元组的 2 个元素开头,传入的第二个元组的最后一个数据被丢弃。
以下为一些示例:
# 无传入
z = zip()
z # <zip at 0x7fe33d1ac440>
list(z)
# []
# 传入一个
z = zip([1,2,3])
list(z)
# [(1,), (2,), (3,)]
# 传入两个
z = zip([1,2,3],[3,4,5])
list(z)
# [(1, 3), (2, 4), (3, 5)]
# 不同长度
z = zip([1,2],[3,4,5])
list(z)
# [(1, 3), (2, 4)]
z = zip([1,2,3],[4,5])
list(z)
# [(1, 4), (2, 5)]
# 解包
coordinate = ['x', 'y', 'z']
value = [3, 4, 5]
result = zip(coordinate, value)
result_list = list(result)
result_list
# [('x', 3), ('y', 4), ('z', 5)]
c, v = zip(*result_list)
c # ('x', 'y', 'z')
v # (3, 4, 5)
在日常应用中,我们一般按照一定的顺序将不同事物的数据存起来,比如我们将 lily、lucy、amy 的身高、体重、年龄按顺序存起来,形成三个列表:
# 分别是每个人的 身高、体重、年龄
lily = [168, 50, 22]
lucy = [170, 55, 25]
amy = [175, 53, 24]
由于每个列表是单一女生的数据,我们求平均身高时可以先操作 zip:
z = zip(lily,lucy,amy)
list(z)
# [(168, 170, 175), (50, 55, 53), (22, 25, 24)]
此时,返回的列表中的第一个值就是所有的身高数据,就可以方便地计算出结果:
z = zip(lily,lucy,amy)
h = list(z)[0]
sum(h)/3
# 171.0
其他案例:
names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]
for name, age in zip(names, ages):
print(name, age)
# Alice 24
# Bob 50
# Charlie 18
另外,zip 对象也可使我们方便地迭代组合信息。
我们知道,如果传入的多个可迭代对的长度不相等,则取最短的进行对应,这类似于木桶效应的短板现象,如果想按最长的处理,不足的用 None 补足补齐,可以使用 itertools 中的 zip_longest 方法:
import itertools
z = itertools.zip_longest([1,2],[3,4,5])
list(z)
# [(1, 3), (2, 4), (None, 5)]
详见:itertools.zip_longest() 最长拉链 。
更新时间:2024-07-04 08:31:26 标签:python zip