Filter&map&reduce 方法 | 学习笔记

简介: 快速学习 Filter&map&reduce 方法

开发者学堂课程【Python 入门 2020年版: Filter&map&reduce 方法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10342


Filter&map&reduce 方法


内容介绍

一、 filter 内置类的使用

二、 map 的使用

三、 reduce 的使用

 

一、filter 内置类的使用

1、filter 是过滤的意思,它在 python2 的时候是内置函数,在 python3 被修改成内置类。

2、filter 需要两个参数一个是 function,是函数的意思,另一个参数是可迭代对象,有很多可迭代对象,举个例子,有一些数据,需要对这些数据进行过滤,筛选出年龄大于 18 岁的。

filter 可以给定两个参数,第一个参数是函数,第二个参数是可迭代对象,这个是这样理解的:可以根据函数对可迭代对象进行过滤。

ages =[12, 23, 30, 17, 16,22,19]

x=filter(lambda ele: ele > 18, ages)

运行结果是一个 filter 类型的对象。filter 结果是一个 filter 类型的对象,也是一个可迭代对象。

3、可迭代对象可以 for 循环

for a in x()

print(a)

打印一下 a,结果是 23、38、22、19 四个数据。根据这个规则来进行过滤的话,小于 18 岁的都不要了,只有大于18岁的才可以被拿到x里。用 filter 对数据进行过滤是很方便的,filter 就是把满足要求的给它拿进来,然后把不满足的给它过滤掉。

直接打印 x:print(x)就会告诉是什么类型的,这是一个对象,在讲面对对象是会介绍。可迭代对象可以用 for 循环,当然也可以不用 for 循环,直接用 list(x)把它转换成一个列表。

adult=list(x)

print(adult)

执行就会得到成年的数据23、30、22、19

4、过滤需要一个函数,函数面有一个布尔值,这个结果要返回的是个布尔值,告诉要以哪个条件来进行过滤,也是一个 lambda 表达式,也是一个匿名函数。

 

二、map 的使用

1、map 跟 filter 很像,也需要两个参数,一个叫函数,另一个叫可迭代对象。

ages =[12,23,30,17,16,22,19]

m = map(lambda ele : ele + 2,ages)

print(m)

运行结果也是一个可迭代对象,可以 list 一下把它变成列表

print(list(m))

运行得到一组数据 14、25、19、18、24、21

2、map 的作用就是把列表里每一个元素都执行一下函数里指定的行为,本来是 12 岁加两岁变成 14,23 加了 2  变成 25 等等,就是把每一个数据都加了 2。加减乘除都是可以的,map 用的不是很多。

 

三、reduce 的使用

1、reduce 以前是一个内置函数,但是后来给它变到一个模块里了,这个模块叫function.py。

内置函数和内置类都在 builtin.py 文件里,写 c 的就是内置类,写 f 的就是内置函数,有很多内置函数,f 是导入模块的语法。

image.png

2、reduce 需要两个参数,一个是 function,另一个是 sequence,sequence 就是一个序列,也可以当作一个列表,比如

scores =[100,89,76,87]

print(reduce(lamba ele1, ele2: ele1 + ele2, scores))

运行,它是一个折叠项,把这些数字都加起来 100+89+76+87,结果是 352, reduce 是求和的,这个算法就是先算前两个数的和,再加上第三个数以此类推。 reduce 这个函数是有一点难度的。

3、def foo(×,y):

return x+y

scores=[100,89,76,87]

print(reduce(foo,scores))

这个代码是不断地变化的一个过程,有点复杂,这里有四个数字,首先它会把 100给 x,把 89 给到 y,这两个数相加结果是 189,把这两个数加完之后,下一次再来调, x 不是 76 而是等于上两次相加的和, y 再等于下一个数 76。

下一次 189 加 76 的结果等于 265,所以 x 就等于 265, y 等于 87,下一次再来 265 再加 87,最后这个结果是 352。

4、知道这个原理后,再举个例子

students=[

{'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},

{'name': 'lisi', age': 21, ‘score': 97, 'height':185},

{'name': 'jack', 'age': 22, 'score':100, 'height': 175},

{'name': 'tony', 'age':23, 'score': 90, 'height': 176},

{'name': 'henry', 'age': 20, ‘score': 95, 'height': 172}]

求所有学生的总年龄,reduce 是减项的意思。需要一个函数,所以就定义一个函数,需要两个变量,在 reduce 里传入 bar 和 students, 刚才说过,这个代码的过程是将这里的元素给到 x,然后算完这个结果之后再给到 y。

def   bar(x, y):

return x['age'] + y['age']

reduce(bar, students)

运行一下,结果崩了, x={'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},它是个字典,y={'name': 'lisi', age': 21, ‘score': 97, 'height':185},现在得到的这个结果是要 x 的 age 加上 y 的 age , x 的年龄是 18 ,y 的年龄是 21,相加 18+21=39,下一次是把这两个的和给到 x,x 等于39,下一次把算到的结果给到 x,但这是个问题,第一次 x 和 y 分别等于那个元素,但是下一次 x 就不再等于这个元素了而是等于上两个数据的和,第一次 x 是一个字典,y 也是个字典,但是下一次再加的时候 x 已经不是字典了,而是 18+21 的和 39,解决这个问题需要后面加一个零,再把 x 后的 age 去掉就行了

def   bar(x, y):

return x + y['age']

print(reduce(bar, students, 0))

运行结果是 104,算一下总年龄就是 104,结果是对的。

把 0 变成 10,print(reduce( bar, students,10))

运行一下结果是 114,如果换成 20,结果变成 124 了。如果不指定初始值,x={'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},y={'name': 'lisi', age': 21, ‘score': 97, 'height':185},指定初始值后 x 就等于 0,y 就等于第一个数据 18,下一次再重新把 x 置成 18,y 再等于下一个数据 21,一次次地加就能得到结果。

支持各种运算,一般情况下会求做加法的运算。乘是可以的,但是不管乘什么结果都是 0 ,因为初始值是 0,如果把初始值换成 1 结果就不是 0 了。

def   bar(x, y):

return x * y['age']

print(reduce(bar, students, 0))

初始值只给 x,没有给 y,因为y要取一个个元素,y 是列表中的第一个字典。

5、print(reduce(bar, students, 0)) 这个代码可以简化 lambda 表达式:

print(reduce(lambda x, y: x + y['age'], students, 0))

运行一下,这个是没有问题的。

这些东西都是很有用的,可以快速地操作一些数据。

 

相关文章
|
28天前
|
存储
`map()`方法在什么场景下会比 `forEach()`方法更高效?
综上所述,当需要对数组元素进行复杂的转换并生成新数组、进行链式调用和函数式编程、处理元素之间存在明确映射关系的情况以及与其他数组方法结合使用时,`map()`方法比`forEach()`方法更高效,能够使代码更加简洁、清晰和易于维护。
54 32
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
74 36
|
28天前
|
存储 JavaScript 前端开发
如何选择使用`map()`方法和`forEach()`方法?
选择使用`map()`方法还是`forEach()`方法主要取决于操作的目的、是否需要返回值、代码的可读性和维护性等因素。在实际开发中,需要根据具体的业务需求和场景来灵活选择合适的方法,以实现更高效、更易读和更易维护的代码。
23 3
|
3月前
|
索引
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
ES5常见的数组方法:forEach ,map ,filter ,some ,every ,reduce (除了forEach,其他都有回调,都有return)
|
2月前
|
存储 JavaScript 前端开发
《进阶篇第8章:vuex》包括理解vuex、安装vuex、搭建vuex环境、四个map方法的使用、模块化+名命空间
《进阶篇第8章:vuex》包括理解vuex、安装vuex、搭建vuex环境、四个map方法的使用、模块化+名命空间
20 3
|
2月前
|
Java
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
vue2知识点:vuex中四个map方法的使用,包括:mapState、mapGetters、mapMutations、mapActions
118 1
|
3月前
|
JavaScript 前端开发
js map和reduce
js map和reduce
|
3月前
|
存储 JavaScript 前端开发
`forEach()`方法和`map()`方法哪个执行效率更高?
`forEach()`方法和`map()`方法哪个执行效率更高?
WK
|
3月前
|
Python
map和filter的区别是什么
`map()`和`filter()`均为Python中的高阶函数,前者针对可迭代对象中的每个元素执行指定操作,如数值翻倍或字符串转大写;后者则筛选出符合条件的元素,例如仅保留偶数或非空字符串。两者均返回迭代器,并可通过`list()`等函数转换为所需的数据结构。具体使用时,应依据实际需求和场景选择合适的函数。
WK
25 1
|
3月前
|
JavaScript 前端开发
JavaScript Array map() 方法
JavaScript Array map() 方法