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

简介: 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中的工作方式:

640.png


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循环一起使用的可视


640.jpg


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


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


m = ["mind", "mouse", "mini"]n = ["norm", "night", "necklace"]
[print(a, b) for a, b in zip(m, n)]


输出:


mind normmouse nightmini 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 normmouse nightmini necklacemini


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


结论


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

相关文章
|
9月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
500 2
|
9月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1622 1
|
10月前
|
数据可视化 搜索推荐 大数据
基于python大数据的北京旅游可视化及分析系统
本文深入探讨智慧旅游系统的背景、意义及研究现状,分析其在旅游业中的作用与发展潜力,介绍平台架构、技术创新、数据挖掘与服务优化等核心内容,并展示系统实现界面。
|
9月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
424 0
|
10月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
394 101
|
10月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
325 99
|
10月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
561 98
|
10月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能

推荐镜像

更多