列表推导式和lambda匿名函数以及map、filter 、zip函数:让你的代码更简洁

(作者:陈玓玏)

一、列表推导式

列表推导式,故名思义,是一种很方便地快速生成列表各项的方法,而且是基于一定的可推导、可迭代的逻辑。说得简单一些,就是简化可以用for语句和if语句组合产生列表的句子。举个栗子:

for i in listA:
    for j in listB:
        if i!=j:
           listC.append([i,j])

这种操作是很常见的,这样的句子多了以后,自然代码就长了。那么用列表推导式就很简单了:

[[i,j] for i in listA for j in listB if i!=j]

这样一行就能把前面的功能实现了。列表推导式也可以嵌套写,这里就不赘述了。但是列表推导式既然是生成列表,那么像递归生成一个最终结果的案例就不能用这种方法了,虽然递归常常也会包含for循环,存在推导关系。

二、lambda匿名函数

匿名函数之所以会被称为匿名函数,就是因为它虽然是函数对象,但是它与我们平时所定义的函数对象不一样,因为它是单个表达式的不具备名称的函数,你可以把你定义的lambda表达式赋值给任意一个名称的函数,然后像正常函数一样使用,也可以在各中对象的方法中使用它,那么此时匿名函数默认的输入对象就会是这个对象。

下面看两个最经典的例子:

#示例1:对于data这个DataFrame对象中的每个值,会进行判断,命中条件则执行倍乘
import pandas as pd
data = pd.Dataframe(dictA,index=listA,columns=listB)
data = data.apply(lambda x:x*2 if x<10)

#示例2:对于非DataFrame对象,比如字典,根据字典的key对字典项进行排序
dictA = dictA.sort(dictA.items,key=(lambda x:x[0])

三、lambda与map、filter等函数一起使用

1、filter函数:

filter函数的功能是过滤掉不需要的信息,filter中传入的两个参数,第一个参数是过滤的条件,第二个参数是需要进行过滤的对象。比如下面的这个例子,实现的就是从0到99的等差列表中过滤出所有大于50的数,构成一个新的列表。使用lambda函数能够避免新定义一个只需要用一次的函数,使代码更简洁灵活。

x = lambda x:x if x>50 else 0
a = filter(x,range(0,100))
print(list(a))

当然,在DataFrame对象中,实现条件过滤更加简单,直接在数据框对象中写条件即可,连lambda函数都可以省了。

2、map函数:

map函数的主要功能是实现映射,比如需要对一个列表中的每个分量求平方。下面给出例子:

#lambda和map一起用:
print(list(map(lambda x:x*x, [1,2,3,4,5])))

不过这个功能直接用列表推导式和生成器也能很方便地实现,而且效率也很高。

3、zip函数:

zip函数是用来打包的,用在for循环中也非常有用,可以做多变量的并行遍历。

a = list(map(lambda x:x*x, [1,2,3,4,5]))
b = list(map(lambda x:x-1, [1,2,3,4,5]))
zipped = zip(a,b)  #打包两个元素
for (i,j) in zipped:
    print((i,j))
zip = zip(*zipped)   #解压缩元素,这个如果放在for循环之前,就会报错,因为zip是zipped的浅复制,解压后zipped也恢复了
print(list(zip))

之后有时间再把生成器和列表推导式的区别整理一下。生成器基本和列表推导式类似,只是一个用[]框起来,一个是用()框起来。

猜你喜欢

转载自blog.csdn.net/weixin_39750084/article/details/80992828