【python】详解zip函数的操作之数据重组

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)

1、生成的xyz是一个zip对象

In [1]: x = [1, 2, 3]
   ...: y = [4, 5, 6]
   ...: z = [7, 8, 9]
   ...: xyz = zip(x, y, z)
#生成的xyz是一个zip对象
In [2]: xyz
Out[2]: <zip at 0x14120b9fac8>
#调用list函数将zip解析为列表,zip就是将每个列表每个对应同一位置添加在一个元组里面
In [3]: list(xyz)
Out[3]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

2、不对等列表的zip

#如果有不对等的列表zip一起的情况时,按照最短的列表进行zip组合
In [4]: h = [2,3,4,5]
In [5]: xyzh = zip(x,y,z,h)
In [6]: xyzh
Out[6]: <zip at 0x14122b44f88>
#h列表中的最后一个因为其他的列表没有对应的位置匹配而舍去
In [7]: list(xyzh)
Out[7]: [(1, 4, 7, 2), (2, 5, 8, 3), (3, 6, 9, 4)]

3、zip(*)是zip的逆过程

#zip(*)是zip的逆过程·
x = [1, 2, 3]                   #unzip过程 类似于zip的逆过程  
y = [4, 5, 6]  
z = [7, 8 ,9]  
xyz = zip(x, y, z)  
zyx = zip(*xyz)                 # *xyz 表示将xyz列表中的元素来zip,当xyz列表中存的是列表元素时,就是将列表元素来zip  
print(list(zyx))                #xyz是:xyz=[[1, 4, 7], [2, 5, 8], [3, 6, 9]]   zip(*xyz)=>zip([1, 2, 3],[4, 5, 6],[7, 8, 9]) 

4、二维矩阵变换(矩阵的行列互换)

#比如我们有一个由列表描述的二维矩阵
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 通过python列表推导的方法,我们也能轻易完成这个任务
[[row[col] for row in a] for col in range(len(a[0]))]

#另外一种方法就是利用zip函数:
In [18]: list(zip(a[0],a[1],a[2]))
Out[18]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
In [20]: list(zip(*a))
Out[20]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
In [22]: list( map(list,zip(*a)))
Out[22]: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#这种方法速度更快但也更难以理解,将list看成tuple解压,恰好得到我们“行列互换”的效果,再通过对每个元素应用list()函数,将tuple转换为list

5、zip函数将字典反转成列表形式

x = {'age':18,'name':'dh','id':3306}  
#以列表返回可遍历的(键, 值) 元组数组  
In [26]: x.items()
Out[26]: dict_items([('name', 'dh'), ('age', 18), ('id', 3306)])

In [27]: x = zip(x.values(),x.keys())
In [28]: x
Out[28]: <zip at 0x202ce13b248>
In [29]: list(x)
Out[29]: [('dh', 'name'), (18, 'age'), (3306, 'id')]

6、zip生成列表的方法

#完成步骤 :
#1: [x]会生成一个只有一个x元素的列表    
#2: [x]*2  列表元素*重复2次
#3: 那么zip(* [x] * 2)则表示zip(x, x)
In [30]: x = [1, 2, 3, 4]
    ...: y = zip(* [x] * 2)          

In [31]: y
Out[31]: <zip at 0x202cef0ea88>

In [32]: list(y)
Out[32]: [(1, 1), (2, 2), (3, 3), (4, 4)]

In [35]: list(zip(*[x]))
Out[35]: [(1,), (2,), (3,), (4,)]

In [36]: list(zip(*[x]*2))
Out[36]: [(1, 1), (2, 2), (3, 3), (4, 4)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值