Python中zip()函数的解释和可视化(实例详解)


Posted in Python onFebruary 16, 2020

Python中zip()函数的解释和可视化(实例详解)

zip()的作用

先看一下语法:

zip(iter1 [,iter2 [...]]) —> zip object

Python的内置help()模块提供了一个简短但又有些令人困惑的解释:

返回一个元组迭代器,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素。当最短的可迭代输入耗尽时,迭代器将停止。使用单个可迭代参数,它将返回1元组的迭代器。没有参数,它将返回一个空的迭代器。

与往常一样,当您精通更一般的计算机科学和Python概念时,此模块非常有用。但是,对于初学者来说,这段话只会引发更多问题。让我们尝试通过示例,代码片段和可视化来解释zip()功能:从许多迭代中获取元素,然后…… 放在一起

我们可以通过几个列表来演示zip()的功能:

uppercase = ['A', 'B', 'C']
lowercase = ['a', 'b', 'c']

for x, y in zip(uppercase, lowercase):
 print(x, y)

输出:

A a B b C c

但是,不限于两个可迭代对象作为参数传递-我们可以添加任意多个:

uppercase = ['A', 'B', 'C']
lowercase = ['a', 'b', 'c']
numbers = [1, 2, 3]

for x, y, z in zip(uppercase, lowercase, numbers):
 print(x, y, z)

这将输出:

A a 1 B b 2 C c 3

让我们直观地看一下该zip()函数在Python中的工作方式:

Python中zip()函数的解释和可视化(实例详解)

zip()函数的另一个重要警告是如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同:

uppercase = ['A', 'B', 'C', 'D', 'E']
lowercase = ['a', 'b', 'c', 'd']
numbers = [1, 2, 3]

for x, y, z in zip(uppercase, lowercase, numbers):
 print(x, y, z)

输出:

A a 1 B b 2 C c 3

正如我们所看到的,即使列出了三个三元组,uppercase和lowercase列表具有5和4个元素。

要知道的重要一件事是zip()函数返回什么。

尽管似乎在调用此函数时会得到一个列表,但实际上它返回一个称为zip object的特殊数据类型,这意味着使用索引将无法浏览,下面我们学习如何将其转换为其他数据类型(例如列表)。

在此之前,我们还应再来学习一下迭代(Iteration)、迭代器对象(iterable)、迭代器(iterator )的概念:

  • Iteration是计算机科学的通用术语。它是指对一组元素执行一项操作,一次执行一个元素。一个很好的例子是循环 -它适用于每个单独的项目,直到整个项目集运行完毕为止。
  • Iterable是可以遍历的对象(译者注:在Python中所有东西都是object, 比如说变量,容器,类),iterable是可以产生iterator的object。
  • iterator是表示数据流的对象,它一次返回一个元素的数据。它还会记住其在迭代过程中的位置。本质上,它控制应如何迭代可迭代对象。

将zip()对象转换为列表(并使用索引)

zip()函数返回一个zip对象(类似于map()操作方式)。

zip对象提供了一些有趣的功能(迭代速度比list更快),但是我们经常需要将其转换为list。为了做到这一点,我们需要调用list()函数:

b = ["red", "green", "blue"]
c = ["leopard", "cheetah", "jaguar"]

print(list(zip(b, c)))

输出:

[('red', 'leopard'), ('green', 'cheetah'), ('blue', 'jaguar')]

list()函数将zip对象转换为一个元组列表。我们可以使用索引浏览各个元组。出于可读性考虑,我们首先将新列表分配给一个变量:

b = ["red", "green", "blue"]
c = ["leopard", "cheetah", "jaguar"]
new_list = list(zip(b, c))
print(new_list[0])
print(new_list[1])
print(new_list[2])

这将输出:

('red', 'leopard') ('green', 'cheetah') ('blue', 'jaguar')

将zip()对象转换成字典

另外,该dict()函数可用于将zip对象转换为字典。需要注意的是,只能使用两个zip()参数-前者产生key,后者产生value:

b = ["red", "green", "blue"]
f = ["strawberry", "kiwi", "blueberry"]

print(dict(zip(b, f)))

输出:

{'red': 'strawberry', 'green': 'kiwi', 'blue': 'blueberry'}

解压列表

在某些情况下,我们需要执行相反的操作——解压迭代器。解压操作涉及将压缩后的元素恢复为其原始状态。为此,我们添加*运算符到函数调用中。例:

a = [1, 2, 3]
b = [4, 5, 6]
zipped = zip(a, b)
list(zipped)

a2, b2 = zip(*zip(a, b))
print(a == list(a2) and b == list(b2))

输出:

True

Zip与列表生成式(for循环潜在问题)

zip()函数与Python中的for循环一起使用的可视化

Python中zip()函数的解释和可视化(实例详解)

在应用for循环后注意缺少的元素!

Python的另一个很棒的功能——列表推导式,可以与zip()函数结合使用。表面上看起来很简单……

m = ["mind", "mouse", "mini"]
n = ["norm", "night", "necklace"]

[print(a, b) for a, b in zip(m, n)]

输出:

mind norm mouse night mini necklace

看起来很简单,似乎没有任何错误,对吗?是的

如果我们想a从列表生成式获取参数并打印出来,我们得到a NameError的报错提示,这是完全正常的,因为a在列表推导之外不是实数:

Traceback (most recent call last): File "C:\Pro\Py\tp-ex\tmp1.py", line 5, in print(a) NameError: name 'a' is not defined

但是,如果我们决定使用for循环而不是列表生成式,然后打印a,我们会得到一些奇怪的结果。请记住,for循环输出的结果与列表生成式的结果相同。

m = ["mind", "mouse", "mini"]
n = ["norm", "night", "necklace"]

for m, n in zip(m, n):
 print(m, n)
print(m)

结果输出是…

mind norm mouse night mini necklace mini

等等,叛逆的mini在这里干什么?事实证明,m先前引用的列表变量"mind", "mouse", "mini"被覆盖了!因此,应该牢记列表生成式和for循环的运行方式完全不同。

结论

好吧,事实证明,zip()函数在 Python 中确实有一些窍门!?与往常一样,鼓励大家实际使用我们的代码示例,而不仅是阅读本文。如果您与代码进行交互并对其进行调整,则肯定会遇到一些独特的问题-解决它们将帮助大家更好地掌握知识。

翻译:爱学习的胡同学原文:

 Python中zip()函数的解释和可视化(实例详解)

总结

以上所述是小编给大家介绍的Python中zip()函数的解释和可视化(实例详解),希望对大家有所帮助!

Python 相关文章推荐
Python编程语言的35个与众不同之处(语言特征和使用技巧)
Jul 07 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
python简单实现获取当前时间
Aug 27 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
python中字符串的操作方法大全
Jun 03 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
PyQt5 多窗口连接实例
Jun 19 Python
python3 深浅copy对比详解
Aug 12 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
Feb 25 Python
基于python的matplotlib制作双Y轴图
Apr 20 Python
python 多态 协议 鸭子类型详解
Nov 27 Python
Python获取字典中某个key的value
Apr 13 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 #Python
使用Tensorboard工具查看Loss损失率
Feb 15 #Python
Keras使用tensorboard显示训练过程的实例
Feb 15 #Python
Python利用逻辑回归分类实现模板
Feb 15 #Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 #Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 #Python
tensorboard显示空白的解决
Feb 15 #Python
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP微信红包API接口
2015/12/05 PHP
php微信公众号开发模式详解
2016/11/28 PHP
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
js读写json文件实例代码
2014/10/21 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
css3中新增的样式使用示例附效果图
2014/08/19 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
物价局领导班子四风问题整改措施
2014/10/26 职场文书
辞职信的写法
2015/02/27 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
院系推荐意见
2015/06/05 职场文书
入党申请书怎么写?
2019/06/11 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android