Python基础学习(3) zip详解

简介

  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)

输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值