简介
zip也是python中比较常用的方法,熟练掌握之后可以将字典、列表等巧妙应用,对于一些复杂结构解包也是一个十分不错的解法。下面我们来详细讲解zip的使用方法。后续遇到可以使用zip巧妙解决的题目的时候也会再进行对应的剖析。
一、压缩匹配
可以将多个可迭代对象(列表、元组等)进行匹配等价,也可以转换成dict、list等,可以双对象、多对象匹配。思考一下,如果两个可迭代对象长度不等,以谁为主呢?
案例1
zip可以匹配多个可迭代对象列表、元组等,但返回对象类型为zip类型,可以将其转换为list、dict等类型可视化
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
paired = zip(names, ages)
print(paired)#直接输入zip类型对象
print(list(paired)) #转换为list类型输出
输出:
案例2
匹配压缩多个对象
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
cities = ["Paris", "London", "Berlin"]
paired = zip(names, ages, cities)
print(list(paired))
输出:
案例3
如果两个可迭代对象长度不相等,会以最短的那个为主体,最后zip压缩数量为最短的数量。
a = [1, 2, 3]
b = ["a", "b"]
print(list(zip(a, b)))
输出:
二、解包操作
在manim中我们知道*有解包操作,而zip也能通过它来进行解包操作。
zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 28)]
names, ages = zip(*zipped)
print(names)
print(ages)
输出:
解释一下是如何起到效果的。在此之前,我们需要知道,对于一个列表,我们可以使用与其等长个变量,分别对这个列表内元素赋值。
a=[1,2,3] #a中有3个元素
b,c,d=a #我们用三个变量对a进行赋值。
print(b,c,d)
输出:
a=[1,2,3,5] #如果元素个数与下面变量数列不匹配,则会报错
b,c,d=a
print(b,c,d)
输出:
在此基础上,我们再看看之前的zip代码
zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 28)]
names, ages = zip(*zipped)
首先,zipped是一个列表对象,*zipped则对其进行了解包。解包操作可以理解为,将一个可迭代对象(比如这里的列表zipped)中的元素,脱离基础框架(相当于列表中的[]),以原始形态展现。当然不是官方解释,自己通过manim理解的。
zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 28)]
# *zipped等价于('Alice', 25), ('Bob', 30), ('Charlie', 28)
python的zip方法是将多个可迭代对象转换成有序组因此,zip(*zipped)返回的是(‘Alice’,‘Bob’,‘Charlie’)、(25,30,28),然后我们可以分别用变量names、ages给其添加个名称,所以输出names和ages是元组类型。(好像跟上面列表赋值操作没太大关系,嘿嘿~)我们下面可以可视化输出一下zip(*zipped)看看是不是我们所想的那样。
zipped = [('Alice', 25), ('Bob', 30), ('Charlie', 28)]
names, ages = zip(*zipped)
print(list(zip(*zipped)))
输出:
没问题,与我们所想的一致。
三、多对象遍历
我们在用for循环的时候,如果对于一个变量,很容易操作,如果对于两个或多个变量的话,似乎比较困难。此时我们可以使用zip将范围进行打包,之后进行for循环方便了很多。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
print(f"{name} is {age} years old.")
输出:
四、创建字典
想了想,还是打算将字典单独拿出来说明饮下。字典在需要复杂问题中都有较多的使用方式,类似于stl中的map,而通过zip将可迭代对象打包并转换成字典类型确实是一种不错的方式。
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 28]
age_dict = dict(zip(names, ages))
print(age_dict)
输出: