python-zip()函数、lambda、map的单独与结合使用

前言

把常见的一些常用函数的基本用法以及符合用法进行总结,该篇文章会不断总结更新内容,不断加入新的代码实例。


一、 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'}
  • 参考博客
  1. zip()函数

综合运用

  • 实例一
  • 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]]

详情点击:Python3 小技巧—— sorted(t, key = lambda _: _[0])用法

三、map表达式

猜你喜欢

转载自blog.csdn.net/HG0724/article/details/117374802