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

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

在应用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函数
zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表.(在海豚实习时自己写了一个要用到zip的函数,那个例子非常代表性) 示例1 for i,j in zip(range(3) ...
- Python中zip()函数用法
定义:zip([iterable, …])zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的l ...
- ZH奶酪:Python中zip函数的使用方法
定义:zip([iterable, …]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些 tuples组成 ...
- python中zip()函数的用法
一. 定义 zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少内存 如果各个迭代器的元素个数不一致,则返回列表长度与最 ...
- python中zip()函数基本用法
zip()函数接受一系列可迭代对象作为参数,将不同对象中相对应的元素打包成一个元组(tuple),返回由这些元组组成的list列表,如果传入的参数的长度不等,则返回的list列表的长度和传入参数中 ...
- python 中zip()函数的使用
zip(*iterables)函数的定义: zip()函数的对象Iterables,iterables可以有多个参数(元组,列表等可迭代对象)组成.通过zip()函数返回一组元组数据,每个元组中的第i ...
- python中zip函数的使用
zip(*iterables) zip可以将多个可迭代对象组合成一个迭代器对象,通过迭代取值,可以得到n个长度为m的元组.其中n为长度最短可迭代对象的元素个数,m为可迭代对象的个数.并且每个元组的第i ...
- python 中zip函数的使用
1.ta = [1,2,3] tb = [9,8,7] tc = ['a','b','c'] for (a,b,c) in zip(ta,tb,tc): print(a,b,c) 2. ta = [1 ...
- 用python实现矩阵转置,python3 中zip()函数
前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...
随机推荐
- 关于Springboot找不到mapper.xml问题
今天在写springboot项目时报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found),找 ...
- .gitignore使用
一.简绍 我们做的每个Git项目中都需要一个".gitignore"文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中.比如我们项目中的npm包(node_modul ...
- python之嵌套函数调用
#定义嵌套函数 def func1(): print('this is func1') def func2(): print('this is func2')#调用1func1()输出:this is ...
- 题解 LA3720
题目大意 多组数据,每组数据给定两个整数 \(n,m\),请求出 \(n\times m\) 的点阵(即 \((n-1)\times(m-1)\) 的方格)中有多少条非水平竖直的经过至少两个格点的不同 ...
- CentOS6.8 LAMP
第一次配置LAMP运行环境,上网查询了很多资料,一边试命令一边学习.服务器重置了很多次. 虽然有OneinStack这个方便的网站一键命令部署,但知道这个网站却是我自己踩坑之后的事情了,故此记录. 1 ...
- Mybatis中jdbcType的类型
具体支持的类型参见:org.apache.ibatis.type.JdbcType ARRAY, BIT, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, REA ...
- 测试必备之Java知识(二)—— Java高级的东西
Java高级 类加载过程 加载(创建class对象) -> 连接(验证-准备-解析) -> 类初始化 类加载器类别 根类加载器:加载java核心类 扩展类加载器:加载JRE目录中的jar包 ...
- python 找到项目使用的所有组件和版本
1.下载模块 pip3 install -i https://pypi.douban.com/simple pipreqs 2.生成文件 pipreqs ./ --encoding=utf-8
- Pandas中merge和join的区别
可以说merge包含了join的操作,merge支持通过列或索引连表,而join只支持通过索引连表,只是简化了merge的索引连表的参数 示例 定义一个left的DataFrame left=pd.D ...
- [bzoj3926] [loj2137] [Zjoi2015] 诸神眷顾的幻想乡
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...