python-zip()函数lambdamap的单独与结合使用
Posted 胜天半月子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-zip()函数lambdamap的单独与结合使用相关的知识,希望对你有一定的参考价值。
前言
把常见的一些常用函数的基本用法以及符合用法进行总结,该篇文章
会不断总结更新内容
,不断加入新的代码实例。
一、 zip()函数与zip(*)函数
- 介绍
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的
zip 对象
。
- zip相当于压缩
- zip(*)相当于解压
- 参数说明:
(1) iterables:可迭代对象,如列表、字典、元组、字符串等,zip() 函数允许多个可迭代对象作为参数。
(2) 当 zip() 函数没有参数时
,则返回空的迭代器。
(3) 当 zip() 函数只有一个参数时
,则从参数中依次取一个元素组成一个元组,再将依次组成的元组组合成一个新的迭代器。
(4) 当 zip() 函数有两个参数时
,分别从两个参数中依次各取出一个元素组成元组,再将依次组成的元组组合成一个新的迭代器。
(5) 返回值:返回一个可迭代的 zip 对象,其内部元素为元组
,可以使用 list()函数 或tuple()函数将其转换为列表或元组
。
详情请见:Python 函数 | zip 函数详解
zip()函数
- 不等长参数
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
- 单参数
>>> x = [1, 2, 3]
>>> x = zip(x)
>>> x
<zip object at 0x000001DB168B0808>
>>> list(x)
[(1,), (2,), (3,)]
- 无参数
>>> x= zip()
>>> x
<zip object at 0x000001DB168B09C8>
>>> list(x)
[]
zip()返回的是对象
,若要以列表的形式展示,需要使用list()方法进行转化
zip(*)函数
- 用于解压zip()
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> list(zip(a,b))
[(1, 4), (2, 5), (3, 6)]
# 方式一
>>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> a1
(1, 2, 3)
>>> a2
(4, 5, 6)
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
# 方式二
>>> u = zip(*zip(a,b))
>
>>> u
<zip object at 0x000001DB168B0648>
>>> print(u)
<zip object at 0x000001DB168B0648>
>>> list(u)
[(1, 2, 3), (4, 5, 6)]
在运行
zip(*zip(a,b))
之前,zip(a,b)的值是:[(1, 4), (2, 5), (3, 6)]
那么,zip(*xyz) 等价于 zip((1, 4), (2, 5), (3, 6))
所以,运行结果是:[(1, 2, 3), (4, 5, 6)]
- 构造字典
>>> x = ['a', 'b', 'c']
>>> y = [1,2,3]
>>> z = zip(x, y)
>>> d = dict(z)
>>> d
{'a': 1, 'b': 2, 'c': 3}
>>> x = ['a', 'b', 'c']
>>> y = ['x', 'y', 'z']
>>> dict(zip(x,y))
{'a': 'x', 'b': 'y', 'c': 'z'}
- 参考博客
综合运用
- 实例一
- cnts :是列表,每个元素是np.array类型的数据,一共10组数据
- boundingBoxes是元组,一共10组数据
cnts 详情数据见:refCnts.txt
# boundingBoxes 的具体数据
boundingBoxes = [(13, 16, 38, 62), (72, 16, 38, 62), (131, 16, 38, 62), (190, 16, 38, 62), (253, 16, 34, 62), (308, 16, 38, 62), (367, 16, 38, 62), (426, 16, 38, 62), (485, 16, 38, 62), (544, 16, 38, 62)]
- 具体代码
sorted(zip(cnts,boundingBoxes),key=lambda b:b[1][0],reverse=False)
# lambda表达式中用到参数key,请看知识补充部分
- 分析
- cnts :假设元素为array(),无需管具体数据是什么
- boundingBoxes:假设元素为 (),无需管具体数据是什么
- 执行结果
[
( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ),
( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ),
( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ), ( array(),(x,y,w,h) ),
( array(),(x,y,w,h) )
]
详情结果数据请见:zip()函数结果详细数据data1.txt
- 知识补充
假如a是一个由
元组构成的列表
,这时候就麻烦了,我们需要用到参数key
,也就是关键词,看下面这句命令,lambda是一个隐函数,是固定写法,不要写成别的单词;x表示列表中的一个元素,在这里,表示一个元组,x只是临时起的一个名字,你可以使用任意的名字;x[0]表示元组里的第一个元素,当然第二个元素就是x[1];所以这句命令的意思就是按照列表中第一个元素排序
更多详情点击:python3排序 sorted(key=lambda)
- 实例二
在实例一的基础上,进行
解压zip(*)
- 具体代码
result = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][0], reverse=False))
list(result) # 详情见data2.txt
- 分析
zip(*代码)
返回的是zip()对象,在此转换为list()类型进行数据结果展示
- 执行结果
[
( array(),array(),array(),array(),array(),
array(),array(),array(),array(),array() ),
( (x,y,w,h),(x,y,w,h),(x,y,w,h),(x,y,w,h),(x,y,w,h),
(x,y,w,h),(x,y,w,h),(x,y,w,h),(x,y,w,h),(x,y,w,h) )
]
详情结果数据请见zip(*)函数结果详细数据data2.txt
二、lambda表达式
- 实例一
# map()函数理解为映射
>>> list(map(lambda x: x*x,[y for y in range(10)]))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- 实例二
使用lambda表达式结合sorted()函数进行排序
>>>a = ([1, 4, 3], [3, 2, 5], [5, 1, 2], [4, 3, 1], [2, 5, 3])
>>>sorted(a, key=lambda _: _[0])
[[1, 4, 3], [2, 5, 3], [3, 2, 5], [4, 3, 1], [5, 1, 2]]
>>>sorted(a, key=lambda _: _[1])
[[5, 1, 2], [3, 2, 5], [4, 3, 1], [1, 4, 3], [2, 5, 3]]
>>>sorted(a, key=lambda _: _[2])
[[4, 3, 1], [5, 1, 2], [1, 4, 3], [2, 5, 3], [3, 2, 5]]
>>> sorted(a, key=lambda z: z[0]) # 也可以使用字母
[[1, 4, 3], [2, 5, 3], [3, 2, 5], [4, 3, 1], [5, 1, 2]]
三、map表达式
以上是关于python-zip()函数lambdamap的单独与结合使用的主要内容,如果未能解决你的问题,请参考以下文章