python3 zip函数 list 不等长_Python3 zip() 函数详解 将多个迭代器逐一匹配聚合形成新的列表对象...

Python3 zip() 函数详解 将多个迭代器逐一匹配聚合形成新的列表对象

zip()函数的主要作用是将多个可迭代对象(字符串、列表、元组等)逐一组合成新的迭代器(zip对象),通过list()函数可以将zip对象转化为列表,列表中保存的是每次数据组合的结果,组合是按照迭代器参数的顺序,每次从每个迭代器中取一个值作为新迭代器的内容,每个组合都是以元组的形式保存,最终多个值(元组)组合成为新的列表。一般常用于组合keys和values,形成多个键值元组。

新迭代器中的每个元组长度,取决于多个参数迭代器中长度最短的那一个,例如:zip('123', 'ab'),最终的结果就是[('1','a'), ('2', 'b')]。如果需要完整提取可以使用itertools.zip_longest(),它对于迭代器中不足长度的部分补None,例如:[('1', 'a'), ('2', 'b'), ('3', None)]。

它是Python的内置函数,在python文件中直接可以使用。

语法

zip(*iterables)

参数

iterables - 一个或多个可迭代对象,支持字符串、列表、元组等,多个可迭代对象不要求类型一致,例如:可以第1个对象是字符串,第2个对象是列表,都不受影响。但不允许使用数字纯数字形式。

*iterables - 聚合的解压模式,将组合后的zip对象解压还原,由于之前组成聚合对象的时候是逐一对应的提取每个迭代器的值,解压也相当于从组合后的每个元组里按顺序提取值,然后组合在一起,就还原回去了。

返回值

新的聚合迭代器,或者解压后的迭代器。

实例

§ 实例1 - 迭代器聚合

zip()函数返回的是一个zip对象,可以使用list()函数查看对象内的值。

>>>zip('123', 'abc')

>>>list(zip('123', 'abc'))

[('1', 'a'), ('2', 'b'), ('3', 'c')]

一般常用于keys和values的组合

>>>key = ['January', 'Feburary', 'March']

>>>values = ['一月', '二月', '三月']

>>>list(zip(key, values))

[('January', '一月'), ('Feburary', '二月'), ('March', '三月')]

§ 实例2 - 解压聚合

执行zip后形成了新的zip对象。我们list()查看它已经被分成了3个元组。

使用*号可以将这3个元组“解压”,与其说是解压,其实也可以理解为一次循环。又一次的从每个元组中按顺序提起值,组成了一个新的数据对象。

>>>list(zip('123', 'abc'))

[('1', 'a'), ('2', 'b'), ('3', 'c')]

>>>z = zip('123', 'abc')

>>>list(zip(*z))

[('1', '2', '3'), ('a', 'b', 'c')]

§ 实例3 - 多对象长度不对等

在上面的函数描述也有提到,如果出现长度不对等,会以最短的那个对象的长度为准,其他对象超过长度的值都会被舍弃,但是我们在开发过程中,值被舍弃是一件很危险的事情。所以我们就可以使用itertools模块的zip_longest()函数来解决这个问题。

#April、May、June没有对应的中文,长度也是values较短,所以它们被舍弃了。

>>>key = ['January', 'Feburary', 'March', 'April', 'May', 'June']

>>>values = ['一月', '二月', '三月']

>>>list(zip(key, values))

[('January', '一月'), ('Feburary', '二月'), ('March', '三月')]

#使用itertools.zip_longest,被舍弃的值将被保留,对应缺少的值都会使用None来替代,我们只要在业务逻辑中做判断就可以了。

>>>list(itertools.zip_longest(key, values))

[('January', '一月'), ('Feburary', '二月'), ('March', '三月'), ('April', None), ('May', None), ('June', None)]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值