当前位置: 首页 > news >正文

python内置zip函数详解

    

     在Python中,zip是一个内置函数(其实是一个class),可以将多个可迭代对象(如列表、元组等)作为参数,将对象中对应index的元素打包成一个个的元组,然后返回由这些元组tuple组成的zip迭代器(之前文章讲过,类中包含了__iter__ 和__next__魔法方法可作为迭代器)。

以下是python3.10版本builtins.py中内置的zip类的原始代码:

zip类接收2个参数:

  • iterables:接受一个或多个可迭代对象,如列表、元组、字符串、字典的键或值(通过keys(), values(), items()等方法获取),range对象等。
  • strict=False(该参数是python3.10版本增加):默认为False,表示当迭代对象的length不同时,zip默认使用最小length组成元组,不会报错。否则传入True时会报某对象的length不一致的错误。

1 zip对象处理逻辑示意图

2 zip对象返回的是迭代器

举例:定义两个列表,通过instance函数判断zip对象是否是迭代器

from collections.abc import Iterable,Iterator
list1 = ['name', 'age', 'color']
list2 = ['wang', '12', 'black']
new_iter = zip(list1,list2)
print(isinstance(new_iter,Iterator))
结果打印为:
True

因为是迭代器,我们可以用next函数返回zip对象的元素。

print(next(new_iter))
print(next(new_iter))

以下打印结果也验证了开篇说明的通过zip函数将可迭代对象相同index位置的元素组成了元组。

('name', 'wang')
('age', '12')

3 将zip对象转为list,tuple,set,dict等对象

既然是返回的迭代器,我们可以将上述示例中的迭代器转为可迭代对象。

  • 转为list对象:
print(list(new_iter))
#结果
[('name', 'wang'), ('age', '12'), ('color', 'black')]
  • 转为tuple对象:
print(tuple(new_iter))
#结果
(('name', 'wang'), ('age', '12'), ('color', 'black'))
  • 转为集合对象:
print(set(new_iter))
#结果
{('name', 'wang'), ('color', 'black'), ('age', '12')}
  • 转为字典对象:
print(dict(new_iter))
#结果
{'name': 'wang', 'age': '12', 'color': 'black'}

注释:如果每个元组元素大于两个,转换字典会报错,因为字典只需要两个元素组成key和value。

4 使用*解包

举例:list1中嵌套了两个list,使用*list1传入zip作为可迭代对象

list1 = [['name', 'age', 'color','height'],['wang', '12', 'black']]
new_iter = zip(*list1)
print(list(new_iter))
结果:
[('name', 'wang'), ('age', '12'), ('color', 'black')]

举例: 拆解为原来的可迭代对象

x = [1, 2, 3]
y = [4, 5, 6]
print(list(zip(x, y)))
#结果
[(1, 4), (2, 5), (3, 6)]
#拆解为原来的可迭代对象
x2, y2 = zip(*zip(x, y))
print(x == list(x2) and y == list(y2))
True

5 strict参数的作用

举例:定义两个不同长度的list,设置strict=True,zip对象执行会报错

list1 = ['name', 'age', 'color','height']
list2 = ['wang', '12', 'black']
new_iter = zip(list1,list2,strict=True)

执行后报ValueError的错误:

参数默认为False则不会报错,结果如下:

new_iter = zip(list1,list2)
print(list(new_iter))
[('name', 'wang'), ('age', '12'), ('color', 'black')]

6 itertools.zip_longest()介绍

如果可迭代对象长度不同,使用itertools.zip_longest对象可以将不满足长度的元素填充其他值代替(默认使用None代替,可传参数fillvalue=其他值)

  • 使用默认值None填充
from itertools import zip_longest 
list1 = ['name', 'age', 'color','height']
list2 = ['wang', '12', 'black']
new_iter1 = zip_longest(list1,list2)
print(list(new_iter1))

结果:

[('name', 'wang'), ('age', '12'), ('color', 'black'), ('height', None)]
  • 设置其他固定值填充
new_iter1 = zip_longest(list1,list2,fillvalue='1m')
print(list(new_iter1))

结果:

[('name', 'wang'), ('age', '12'), ('color', 'black'), ('height', '1m')]

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习和关注,谢谢大家。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux——多路复用之poll
  • ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾
  • arcgis紧凑型切片缓存(解决大范围切片,文件数量大的问题)
  • 三、初识C语言(3)
  • 【Apache Doris】周FAQ集锦:第 14 期
  • 第六章 Spring框架深入学习(2023版本IDEA)
  • ArcGIS Pro SDK (九)几何 8 线段
  • 十七、【机器学习】【非监督学习】- K-均值 (K-Means)
  • 综合性API数据流通服务商天聚地合于香港联合交易所主板成功上市
  • Java文件管理
  • 防火墙双机热备旁挂
  • 类和对象(二)
  • “社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎
  • 对象存储解决方案:高性能分布式对象存储系统MinIO
  • ARP安全简介
  • 收藏网友的 源程序下载网
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • ComponentOne 2017 V2版本正式发布
  • eclipse的离线汉化
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IOS评论框不贴底(ios12新bug)
  • MySQL-事务管理(基础)
  • React Transition Group -- Transition 组件
  • Redis字符串类型内部编码剖析
  • spring学习第二天
  • 经典排序算法及其 Java 实现
  • 聊聊redis的数据结构的应用
  • 码农张的Bug人生 - 见面之礼
  • No resource identifier found for attribute,RxJava之zip操作符
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • FaaS 的简单实践
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​secrets --- 生成管理密码的安全随机数​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (pytorch进阶之路)扩散概率模型
  • (八十八)VFL语言初步 - 实现布局
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • **PHP二维数组遍历时同时赋值
  • .Net Core 生成管理员权限的应用程序
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net mvc总结
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET建议使用的大小写命名原则
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .net快速开发框架源码分享
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [ACP云计算]组件介绍
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作