python zip的高阶应用

Python中的map函数和zip函数使用总结 map函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 1、当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新的seq。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用m... 阅读详情

zip() 函数主要用于对可迭代的对象的打包与解包操作。

  • 将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
  • 利用 * 号操作符,可以将元组解压为列表。

zip()函数的使用语法如下:

zip(iterable1,iterable2, ...)

其中iterable是- 一个或多个可迭代对象(字符串、列表、元祖、字典等)。
接下来从最基础的用法开始一步步来看一下zip的打包与解包。

1. zip的基本应用

1.1 合并两个列表

>>> list1 = [1,2,3]
>>> list2 = [4,5,6]
>>> zip(list1,list2)
<zip at 0x20cd7ebc708>  

在Python3中zip返回值与map、fileter类似,是一个类似生成器的zip对象,如果我们要查看其中的值,可以通过for遍历或者直接用list来转换成列表。
for循环遍历:

>>> for i,j in zip(list1,list2):
>>>     print(i,j)
    1 4
    2 5
    3 6

>>> for i in zip(list1,list2):
>>>     print(i)
    (1, 4)
    (2, 5)
    (3, 6)

list转成列表:

>>> list(zip(list1,list2))
[(1, 4), (2, 5), (3, 6)]   

1.2 将两个列表合成字典

>>> keys = ['width','height','weight']
>>> values = [100,200,50]
>>> dict(zip(keys,values))
    {'width': 100, 'height': 200, 'weight': 50}

zip将参数中的两个列表,按对应位置进行了打包,生成的元组对,经过dict转换为了字典。

1.3 嵌套列表怎么办?

如果是嵌套列表,又该如何使用zip呢?

>>> list3 = [[1,2,3],[4,5,6]]
>>> zip(list3)
    <zip at 0x20cd7ebcd08>
>>> list(zip(list3))
    [([1, 2, 3],), ([4, 5, 6],)]

这里的输出不是我们想要的把两个列表对应位置打包在一起,这该如何是好?请继续看。

2. 使用zip(*)解包

首先,我们要知道,在python中*的含义除了乘法外,还表示了对列表或元组的解包。
来,我们看下面的例子:

>>> def print_x_y(x,y):
>>>     print('x:',x,'y:',y)

>>> xy = [1,2]
>>> print_x_y(1,2)
    x: 1 y: 2
>>> print_x_y(*xy)
    x: 1 y: 2
>>> print_x_y(xy)
    TypeError: print_x_y() missing 1 required positional argument: 'y'

函数print_x_y的参数为两个,如果我们直接把xy这个列表输入的话会因为就输入了一个值而报错误,如果我们输入参数为*xy时就得到了正确的结果,因而,*的含义就是将列表或元组中的多个元素给解包出来。
我们继续上面的问题,我们可以把zip([[w,x],[y,z]])中的两个内层列表[w,x]、[y,z]看成两个参数,对嵌套列表list3解包后,对嵌套的每个内层列表进行打包:

>>> list(zip(*list3))
    [(1, 4), (2, 5), (3, 6)]

2.1 矩阵转置

据此,我们可以很间单的写出矩阵的转置:

>>> matrix = [ [1,2,3,4],
               [5,1,2,3],
               [9,5,1,2],
               [4,9,5,1],
               [7,4,9,5]]

>>> list(map(list,list(zip(*matrix))))
    [[1, 5, 9, 4, 7], 
     [2, 1, 5, 9, 4], 
     [3, 2, 1, 5, 9], 
     [4, 3, 2, 1, 5]]

2.2 矩阵点乘

>>> matrix1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> matrix2 = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
# 矩阵点乘
>>> print([[x1*x2 for x1, x2 in zip(row1, row2) ] for row1, row2 in zip(matrix1, matrix2) ])
    [[1, 2, 3], [8, 10, 12], [21, 24, 27]]

# 矩阵相加
>>> print([[x1+x2 for x1, x2 in zip(row1, row2) ] for row1, row2 in zip(matrix1, matrix2) ])
    [[2, 3, 4], [6, 7, 8], [10, 11, 12]]

3. zip的高阶应用——合并列表中相邻的n项

我们对如下代码分析:

>>> s = [1,2,3,4,5,6]
>>> n = 3
>>> list(zip(*[iter(s)]*n))
    [(1, 2, 3), (4, 5, 6)]

3.1 补充知识

3.1.1 iter生成迭代器

首先,我们来看python中非常重要的一个内置函数iter()。
这里先简要介绍一下关于迭代器的几个概念:(详细内容可参考博客:https://www.cnblogs.com/weiman3389/p/6044963.html)

  • 可迭代对象。在python中只要实现了__iter__方法的对象就是可迭代对象,可迭代对象最大的特点就是能使用for循环、列表解析、逻辑操作符这几个操作。
  • 迭代器。具有next方法的对象都是迭代器。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。
  • iter()函数。将可迭代对象转换成迭代器。

3.1.2 python中[x]*n实现列表重复n次

python中可通过[x]*n将列表[x]中的元素重复n次变成 [x,x,...],

>>> lst1 = ['a'] * 3
>>> lst1
    ['a', 'a', 'a']
>>> lst1[0] = 'b'
    ['b', 'a', 'a'] 

不过当我们执行下述代码时,看看发生了什么?

>>> lst2 = [[1,2]] * 3 
>>> lst2
    [[1,2], [1,2], [1,2]]
>>> lst2[0][0] = 0
>>>> lst2
    [[0, 2], [0, 2], [0, 2]] 

WTF?发生了什么?这是因为[x] * 3这个操作实际上没有复制x,而只是创建了三个object reference,当x为不可变对象时,改变其中的某个值另外的值不会变,而当x为可变对象时(列表),改变lst2[0][0]的同时也改变了lst2[1][0]和lst2[2][0]。

3.2 解包分析

我们逐步分析以上代码:
首先,从前面的介绍我们指导,zip可以将多个列表打包。我们可以很容易理解以下代码:

>>> list(zip(s,s,s))
    [(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6)]
>>> list(zip(*[s,s,s]))#将列表中参数解包给函数,所以与上面完全相同
    [(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6)]

python中的list为可迭代对象但不是迭代器,经过iter()转换后变成了迭代器,这个转换过程发生了什么变化呢?
list中做遍历的时候,遍历完之后list中的元素不发生变化,而变成了迭代器以后,对迭代器遍历每次执行的都是next函数,迭代器中前面的元素就不存在了,只有下一个元素。
这里写图片描述
如图所示,上图为列表,下图为迭代器。
上图中蓝色数字为遍历的顺序,对s按次序遍历3次,右侧是zip(s,s,s)的结果,而下图中,因为3个it是同一个迭代器的引用,每次遍历都只有next,故遍历6次生成了两个元组。

>>> it = iter(s)
>>> [it,it,it]
    [<list_iterator at 0x20cd92b5240>,
     <list_iterator at 0x20cd92b5240>,
     <list_iterator at 0x20cd92b5240>]

>>> [it]*3
    [<list_iterator at 0x20cd92b5240>,
     <list_iterator at 0x20cd92b5240>,
     <list_iterator at 0x20cd92b5240>]
>>> list(zip(it,it,it))
    [(1, 2, 3), (4, 5, 6)]

回到我们最初的代码,zip(*[it]*3) 即zip(*[it,it,it])即zip(it,it,it),因此:

list(zip(*[it]*3))
    [(1, 2, 3), (4, 5, 6)]

一定要注意,这里的三个it是同一个迭代器,如果传入的三个参数是分别取迭代器的话,那么和传入三个list是一样的效果了,大家可以对比上图思考一下:

>>> list(zip(iter(s),iter(s),iter(s)))
    [(1, 1, 1),
     (2, 2, 2),
     (3, 3, 3),
     (4, 4, 4),
     (5, 5, 5),
     (6, 6, 6),
     (7, 7, 7),
     (8, 8, 8),
     (9, 9, 9)]

致谢:

  1. Python使用zip合并相邻列表项的方法示例。https://www.codercto.com/a/14709.html
  2. Python可迭代对象、迭代器和生成器。https://www.cnblogs.com/weiman3389/p/6044963.html
  3. Hidden features of Python。 https://stackoverflow.com/questions/101268/hidden-features-of-python
  4. The Python Tutorial 。https://docs.python.org/3/tutorial/controlflow.html#tut-unpacking-arguments
39文章解读与程序——EI\CSCD\北大核心《基于两阶段鲁棒优化算法的微网多电源容量配置》已提供下载资源 电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。 阅读详情

相关推荐

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GStreamer的解码方式解码,大多情况应该存在上图马赛克的问题,请勿紧张,其实上述url并没有调用硬件解码,后面有调用硬件解码的ULR,我们来在接下来的介绍中释获。通过RTSP协议连接海康威视摄像头将图片送入AI推理,发现OpenCV的VideoCapture使用的是软解码大量消耗了cpu的资源,并无法做到实时数据处理存在5秒钟的延时。只能把解码这部分送到硬件解码器去处理分摊掉cpu的压力,

Starry-SkyJing的博客 2427

【深度学习笔记】Task2 神经网络优化 2

深度学习笔记-神经网络优化2.1 预备知识2.2 复杂度学习率 2.1 预备知识 tf.where() 条件语句真返回A,条件语句假返回B tf.where(条件语句,真返回A,假返回B) import tensorflow as tf a=tf.constant([1,2,3,1,1]) b=tf.constant([0,1,3,4,5]) #如果a>b,返回a对应位置的元素,否则返回b对应位置的元素 c=tf.where(tf.greater(a,b),a,b) print('c:',c)

一一xi的博客 517

AXI backpressure反压机制代码

本文将xilinx的axi读写代码进行修改,实现吞吐量达到50%

m0_64636251的博客 1764

Python 并行遍历zip()函数使用方法(更新日期:2017-07-11)

Python 并行遍历zip()函数使用方法

把你挖出来的博客 4016

ThingsKit物联网平台产品管理之物模型

物模型是ThingsKit物联网平台为产品定义的数据模型,用于描述产品的功能。本文介绍物模型相关概念和使用限制。

云腾五洲官方博客 1174

非目标代谢组学(untargeted metabolomics)中常用的方法学考察的方法(四)

最早使用的一种方法,从QC样本的总离子流图中选择具有代表性的离子峰(覆盖不同的保留时间,不同的强度),在对QC样本进行重复检测之后,计算这些离子的保留时间以及峰面积的相对标准偏差(RSD),用以考察分析方法的稳定性以及重复性。所有样品检测完之后,收集所有的QC样本的原始数据进行数据预处理,包括(峰提取,排列,归一化等),经过数据过滤(80%规则)之后,计算剩下的峰的峰面积的RSD值。由于QC样本是 等量混合了所有的被检测样本,理论上QC样本包含了所有样本中的代谢物,因此QC样本理论上会。

hlllllllhhhhh的博客 1488

Python for循环中的zip

s = ["1", "2", "3", "4", "5"] t = ["a", "b", "c", "d", "e"] for x, y in zip(s, t): print(x+"-"+y) print("######") u = {"1", "2", "3", "4", "5"} v = {"a", "b", "c", "d", "e"} for x, y in zi...

Zhang Phil 1万+

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 503

python zip函数用于for循环,python中zip函数的作用

大家好,小编来为大家解答以下问题,python zip函数用于for循环,python中zip函数的作用,现在让我们一起来看看吧!

wenangou6 891

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

摘要:OpenClaw 运行出现"100% context used 309.9k/200k"报错,表示上下文窗口超出200k Token限制。解决方法包括:1) 重启服务或新建会话清空缓存;2) 修改配置文件提升context_window值;3) 长期优化如限制历史对话轮数、分批处理长文本。该问题通常由输入过长或多轮对话累积导致,需控制单次输入量在阈值内。

奶爸的编程之路,也就一周冷个三天 3236

Python高阶函数使用总结

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。,其含义指的是:对后面可迭代序列中的每个元素执行前面的函数。

m0_59236602的博客 1203

Apollo 9.0 参考线生成器 -- ReferenceLineProvider

在基于参考线的规划算法中,参考线是Planning一切工作的基础和前提,所以搞清楚参考线怎么来的就变得很重要。为此,首先需要了解Planning 与 Routing的交互,通过交互得到路径片段,这些路径片段就告诉我们该怎么走,再在此基础上生成参考线,最后使用不同的平滑算法对参考线进行平滑,得到一条光滑的参考线。

WaiNgai 1665

Python——高阶函数——map filter zip

一、map函数 1、作用:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 2、实例 def f(x): return x*x a = list( map (f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) print (a)#[1, 4, 9, 16, 25, 36, 49, 64...

weixin_30430169的博客 167

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

列举5个python内置函数_Python5个内建高阶函数的使用

描述本文结合各种实际的例子详细讲解了Python5个内建高阶函数的使用,能够帮助理解Python的数据结构和提高数据处理的效率,这5个函数分别是:mapreducefiltersorted/sortzip一、map1.1 语法map函数的基本语法是map(func, seq),其含义指的是:对后面可迭代序列中的每个元素执行前面的函数func的功能,最终获取到一个新的序列。注意:Python2中直...

weixin_33855578的博客 167

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python高阶函数讲解

Python高阶函数讲解递归函数斐波拉契数列(Fibonacci),匿名函数时间差_time模块高阶函数(1):filter(2):map(3):reduce(4)apply(5)zip 递归函数 递归是颇为高级的话题,它在Python中相对少见。然而,它是一项应该了解的有用的技术,因为它允许程序遍历拥有任意的、不可预知的形状的结构。递归甚至是简单循环和迭代的替换,尽管它不一定是最简单的或最高效的...

Dana_Baron的博客 603

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

列举五个python内置函数和使用方法_Python5个内建高阶函数的使用

本文结合各种实际的例子详细讲解了Python5个内建高阶函数的使用,能够帮助理解Python的数据结构和提高数据处理的效率,这5个函数分别是:mapreducefiltersorted/sortzip一、map1.1语法map函数的基本语法是map(func,seq),其含义指的是:对后面可迭代序列中的每个元素执行前面的函数func的功能,最终获取到一个新的序列。注意:Python2中直接返回的是...

weixin_29295541的博客 271

一文看懂Python列表表达式及高阶函数如lambda, zip, enumerate, map和filter方法。

深入了解和熟练使用python的列表表达式和内置的一些高阶函数如lamda, zip, enumerate, map, filter, reduce, sorted方法是python学习,面试和工作的必备技能。正是它们给了python优秀的特性,从而使python有别于其它编程语言。网上的介绍和教程有很多,但感觉还是比较零散,解读也不够深入,小编决定再次动手写篇总结。如果大家还没读过小编写的一文看...

大江狗 7695

Python学习笔记 - filter,map,reduce,zip

1. filter filter函数用于过滤可迭代对象。它的语法是这样的: filter(function or None, iterable) --> filter object 复制代码第一个参数是一个函数,第二个参数是一个可迭代对象。filter函数会根据第一个参数返回True还是False来决定第二个参数中每一项元素是否保留,它返回的是一个filter对象。 例子: filter对...

weixin_34190136的博客 466

Python 高阶函数(详解)

1、当定义函数时,函数的参数是一个函数,那么定义的这个函数可以称为高阶函数。2、调用高阶函数时需要特别注意,由于高阶函数中参数类型是个函数,因此在进行调用时,我们只需要传递函数的名字即可,而不是进行函数调用。3、函数作为参数的类型时,可以是内置的函数,如abs,也可以是其它模块下的函数,如sqrt,也可以是自定义的函数,如num_num,像上面代码中num_num函数的函数体只有一行代码,可以用lambda表达式的方式写。

2301_78209919的博客 1817

Python中map、filter、zip、reduce用法

Python中map、filter、zip、reduce用法 map 它接收一个函数 f() 和一个 list,遍历 list 中的元素来调用函数 f ,得到一个新的 list 并返回。 格式: map(function, sequence) Test1-求列表每个元素的平方 def s(num): return num * num l = [1, 2, 3] result = map(s, l) print(list(result)) Out: [1, 4, 9] Test2-两个列表对

qq_42452095的博客 339

Python 高阶函数lambda、map、reduce、filter、zip、sorted等使用

print('****************************************************lambda*************************************************************') # lambda函数 就是所谓的匿名函数 g = lambda x,y:x + y # 就是返回x+y的值 print(g(5,3)) g ...

haeasringnar的博客 719

一文看懂Python列表表达式及高阶函数如lamda, zip, enumerate, map和filter方法。

深入了解和熟练使用python的列表表达式和内置的一些高阶函数如lamda, zip, enumerate, map, filter, reduce, sorted方法是python学习,面试和工作的必备技能。正是它们给了python优秀的特性,从而使python有别于其它编程语言。网上的介绍和教程有很多,但感觉还是比较零散,解读也不够深入,所以决定再次动手写篇总结。本文内含很多实例代码,以帮助新...

liuskyter 440

Python高阶函数使用总结!

↑↑↑关注后&#34;星标&#34;Datawhale每日干货&每月组队学习,不错过Datawhale干货作者:皮钱超,厦门大学,Datawhale原创作者本文约2000...

Datawhale 473

python使用高阶函数实现_4 python 高阶函数

python 高阶函数1.匿名函数lambda --函数的实现比较简单的时候,用lambda2.map() 映射3.reduce() 累加4.filter() 过滤5.zip()---非高阶函数recursion 递归closure闭包正文:首先要知道什么是高阶函数:一个函数作为参数,传入另一个函数1.匿名函数 lambda表达式(函数)1).为什么使用匿名函数?简化函数的书写,不需要函数名,便...

weixin_39613824的博客 203

Python 高阶函数

高阶函数: map reduce sorted filter zip 1.map(func, *iterables) --> map object Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted. map(func, *iterables) 参数: function :函数

m0_57156345的博客 158
上一篇: python爬取长春长生2016-2018所有被批准疫苗批次
下一篇: lightgbm的原生版本与sklearn 接口版本对比
PIPIXIU
博客等级 码龄10年 68粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值