栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

小白也能看的懂系列之【Python】中的 zip() 、zip(*) 与*zip()函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

小白也能看的懂系列之【Python】中的 zip() 、zip(*) 与*zip()函数

小白也能看的懂系列之Python中的zip()、zip(*)与*zip()函数
    • 一 、 zip()函数解释:
      • 1. 只有一个参数序列的情况:
      • 2. 两个或多个参数的情况
      • 3. 序列截断的情况
      • 4. zip()的返回值
    • 二、 * 的使用
    • 三、 zip() 、zip(*) 与*zip()函数
      • 1. zip(keys, values)
      • 2. 用序列解包同时遍历多个序列(for x,y in zip(keys, values):)
      • 3. zip(*)
      • 4. *zip()

一 、 zip()函数解释:

zip(keys, values)函数为打包函数。
zip函数是将输入的多个(包含一个)参数序列中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
列表第i位的元素是由每一个参数序列中的第i位构成的一个元组,且返回的列表会自动截断为参数序列的最短长度。
举例:

1. 只有一个参数序列的情况:
>>>a=[1,2,3]
>>>aa=zip(a)
>>>print(aa)
[(1,),(2,),(3,)]

即将单个元素打包成元组。

2. 两个或多个参数的情况
>>>a=[1,2,3]
>>>b=[4,5,6]
>>>c=zip(a,b)
>>>print(c)
[(1,4),(2,5),(3,6)]
>>>m=[[1,1],[4,5]]
>>>n=[[1,2],[2,3]]
>>>print(list(zip(m,n)))
[([1, 1], [1, 2]), ([4, 5], [2, 3])]

将参数序列中对应的元素打包成一个个元组,例如上述代码中序列a中的第一个元素为1,对应的序列b中的第一个元素为4,故将1和4打包成一个元组,成为新列表c中的第一个元素。

3. 序列截断的情况
 >>>a[1,2]
 >>>b=[1,2,3]
 >>>print(zip(a,b))
 [(1,1),(2,2)]  #以最短长度截断

上述输入的参数列表中最短序列为a,只有两个元素,故到序列b中的第三个元素3时被截断,形成的新序列为两个长度的新序列(注:(1,1)为一个长度)。

4. zip()的返回值

zip函数的返回对象类型是一个zip类型,我们直接来输出返回值的结果,实际上是返回了这个zip对象在内存中的存储位置。

# 定义三个列表
>>>a = [1, 2, 3]
>>>b = [4, 5, 6]
>>>c = zip(a, b)
>>>print("c类型%s" % type(c))# 输出zip函数的返回对象类型
c类型
>>>printc)# 输出c
# c这个zip对象在内存中的存储位置

如需展示列表,需手动 list() 转换;如需展示字典,需手动 dict() 转换。下面我们将结果c用列表的形式展示出来:

>>>print(list(c))
[(1, 4), (2, 5), (3, 6)]
二、 * 的使用

*是对序列进行解包(可以理解为从外向内去括号)。在实参面前加上一个 * 号进行序列解包。或在实参字典前加两个星号**进行解包。
例如:

>>> print(*[1,2,3,4],4,*(5,6))
1 2 3 4 4 5 6
>>> *range(4),4
(0, 1, 2, 3, 4)
>>> {*range(4),4,(5,6,7,8,9)}
{0, 1, 2, 3, 4, (5, 6, 7, 8, 9)}
>>> {*range(4),4,*(5,6,7,8,9)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {'x':1, **{'y':10}}#实参字典解包
{'x': 1, 'y': 10}
>>>*[['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']]
['a1', 'a2', 'a3'] ['b1', 'b2', 'b3']
三、 zip() 、zip() 与zip()函数 1. zip(keys, values)

序列解包也可以适用于列表和字典呢,字典的话默认是对“key”进行操作, 如需对“key”-“value”进行操作则需要使用字典的items()方法进行操作。“value”进行操作的话就使用values()进行操作。

#列表进行解包
>>>a = [1, 2, 3, 5, 6]
>>>b, c, d, f, g = a
>>>print(b, c, d, f, g)
 1 2 3 5 6

#字典进行解包
>>>test_dicts = {'a': 'x', 'b': 1, 'c': 3}#以字典中第一个元素为例,'a'为“key”,'x'为“value”。
>>>q, w, e = test_dicts#字典默认是对“key”进行操作
>>>print(q, w, e)
a b c
>>>r, t, y = test_dicts.items()#用items()对“key”-“value”进行操作
print(r, y, t)
('a', 'x') ('c', 3) ('b', 1)
>>>i, o, p = test_dicts.values()#使用values()对“value”进行操作
print(i, o, p)
x 1 3
2. 用序列解包同时遍历多个序列(for x,y in zip(keys, values):)
>>>m=[[1,1],[4,5]]
>>>n=[[1,2],[2,3]]
>>>print(zip(m,n))
[([1, 1], [1, 2]), ([4, 5], [2, 3])]
>>>for a,b in zip(m,n):#a,b的实际形式为(a,b)故a,b的值为zip(m,n)中(,)内对应位置的值,如zip(m,n)的第一个元素为([1, 1], [1, 2]),则a的值对应为[1, 1],b的值对应为[1, 2]
        print(a,b)
[1, 1] [1, 2]
[4, 5] [2, 3]   
#a值     b值        
3. zip(*)

该函数的运算顺序:先对 * 后面的序列进行解包,之后用zip()函数进行打包。

>>>nums = [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3']]# 声明一个列表
>>>print(*nums)
['a1', 'a2', 'a3'] ['b1', 'b2', 'b3']
>>>iters = zip(*nums)  # 参数为list数组时,是压缩数据,相当于zip()函数
>>>print("type of iters is %s" % type(iters))# 输出zip(*zipped)函数返回对象的类型 
 
# 因为zip(*zipped)函数返回一个zip类型对象,所以我们需要对其进行转换
>>>print(dict(iters))# 在这里,我们将其转换为字典
type of iters is 
>>>print(list(iters))# 在这里,我们将其转换为列表
[('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]
4. *zip()

该函数的运算顺序:zip()先对序列进行打包,然后 * 对打包好的序列进行解包。

# 创建2个列表
>>>m = [1, 2, 3]
>>>n = [4, 5, 6]
>>>print(zip(m, n))
[(1, 4), (2, 5), (3, 6)]
>>>print("*zip(m, n)返回:", *zip(m, n))
(1, 4), (2, 5), (3, 6)
>>>m2, n2 = zip(*zip(m, n))
>>>print("m2和n2的值分别为:", m2, n2)
m2和n2的值分别为:(1,2,3),(4,5,6)
# 若相等,返回True;说明*zip为zip的逆过程
>>>print(m == list(m2) and n == list(n2))
True

我也是小白,这是根据自己的理解一点一点码的,如果觉得有用,还请点个赞鼓励一下哦!如果有什么错误也欢迎留言交流哦!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/304277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号