文末有惊喜哦

天给大家介绍的是Python当中三个非常神奇的方法:map、reduce和filter

一.Map

Map除了地图之外,另一个英文本意是映射。在C++和Java一些语言当中,将map进一步引申成了存储key和value映射结构的容器。Python对这点做了区分,KV结构的容器命名成了dict,即字典,而map则回到了它的本意,也就是映射

我们都知道,在数学领域,映射也是函数的定义。一个自变量通过某种映射,对应到一个因变量。同样,在Python当中,map操作本质也是函数,不过它作用的范围不再是单个变量,而是一个序列。换句话说,通过map我们可以省去循环操作,可以自动将一个容器当中的元素套用一个函数。

举个简单的例子,比如我们有一个坐标,我们希望知道它距离原点的距离。这个问题很简单,我们写一个计算距离的函数就可以解决:

那如果我有多个点需要计算距离,在map出现之前,我们只能用循环来解决问题:

但是有了map之后, 我们可以省去循环的操作,整个代码简化成了一行:

但是要注意,我们调用完map之后得到的结果不是一个list而是一个迭代器。我们直接将map返回的内容print出来,可以得到这样一个结果:

这是一个类的标准输出,其实它返回的不是最后的结果,而是一个迭代器。我们在之前的文章当中已经介绍过了迭代器和生成器的相关概念,这里不多做赘述了。

我们想要获得完整的内容也很容易,我们只需要将它转化成list类型即可:

以上过程还可以进一步简化,还记得匿名函数吗?由于dis函数在我们的程序当中只会在map中用到,我们完全没有必要单独创建一个函数,我们可以直接传入一个匿名函数搞定运算:

简单总结一下,map操作其实执行的是一个映射。它可以自动地将一个序列当中的内容通过制定的函数映射成另一个序列,从而避免显式地使用循环来调用,在很多场景下可以大大地简化代码的编写,可以很方便地将一个序列整体转变成另一个结果。

二.Reduce

相比于map,reduce的操作稍稍难理解一点点。它也是规定一个映射,不过不是将一个元素映射成一个结果。而是将两个元素归并成一个结果。并且它并不是调用一次,而是依次调用,直到最后只剩下一个结果为止。

比如说我们有一个数组[a, b, c, d]和一个函数f,我们计算reduce(f, [a, b, c, d])其实就等价于f(f(f(a, b), c), d)。和map不同的是,reduce最后得到一个结果,而不是一个迭代器或者是list。

我们光说有些抽象,不妨来看一个例子,就看最简单的一个例子:reduce函数接收两个数,返回两个数的和。那么显然,我们依次调用reduce,得到的就是原数组的和。

最终得到的结果当然是10,同样,我们也可以将reduce中的方法定义成匿名函数,一样不影响最终的结果。

三.MapReduce

既然我们map和reduce都有了,显然我们可以将它们串联起来使用,也就是分布式系统当中MapReduce的做法。虽然如果不手动使用线程池的话,Python并不会起多个线程来加速运算,但是至少可以简化我们实现的代码。我们还是举经典的wordCount的例子,也就是文本计算词频

套用map和reduce的功能,整个流程非常清晰,我们只需要在map阶段对文本进行分词,在reduce阶段对分词之后的结果进行汇总即可。

听着好像非常容易,但是你实际去上手是写不出来的。原因也很简单,因为hadoop当中的Map和Reduce中间还有一层shuffle的操作,会自动地将key值相同的结果放到同一个reducer当中。在这个问题当中,key自然就是我们的word,由于相同的word被放到同一个reducer当中,我们只需要累加就行了。但是如果我们自己编写mapreduce的话,由于缺少了中间数据重排的步骤,所以导致不能实现。

要解决也简单,我们可以人为增加一个map阶段代替hadoop当中的重排。相当于做了一个MapMapReduce,我们来看代码:

那如果我们不用多次MapReduce呢?也不是没有办法,需要取点巧,方法也简单只要使用Counter类,就可以完美解决这个问题。我们来看代码:

由于我们使用了Counter,所以我们在map阶段返回的结果就已经是词频的dict了,而在reduce阶段我们只需要将它们全部累加起来就OK了。

最后,我们来看下filter。

Filter

filter的英文是过滤,所以它的使用就很明显了。它的用法和map有些类似,我们编写一个函数来判断元素是否合法。通过调用filter,会自动将这个函数应用到容器当中所有的元素上,最后只会保留运行结果是True的元素,而过滤掉那些是False的元素。

举个例子,假设我们想要保留list当中的奇数而过滤掉偶数,我们当然可以直接操作,比如:

而使用filter会非常方便:

从这个例子当中可能看不出便捷,但是有的时候判断的条件可能非常复杂,我们判断的逻辑不能简单地在list定义当中表达出来,这个时候使用filter则会容易得多。

最后, 我们再看一个类似的用法。在itertools当中有一个方法叫做 compress,通过compress我们可以实现根据一个序列的条件过滤另一个序列。

举个简单的例子,假设,我们有两个数组:

我们想要获取所有考试及格的同学的list,如果用常规做法基本上免不了使用循环,但是使用compress可以很方便地通过一行代码实现:

需要注意的是filter和compress返回的都是一个迭代器,我们要获取它们的值,需要手动转换成list

虽然在日常的开发当中不使用这三样神器同样可以工作,但是用上它们之后,会提升很多代码的可读性,节省很多无用的代码。尤其是在面试的时候,很有可能就会给面试官留下不一样的印象,也许结果也会不同。

今天的文章就是这些,如果觉得有所收获,请顺手点个在看或者转发吧,你们的举手之劳对我来说很重要。

End.

来源:TechFlow

本文为分享转发,转载请联系原作者

java filter函数的用法_5分钟掌握Python | Map、Reduce和Filter如何运用?相关推荐

  1. c++ map用法_5分钟掌握Python | Map、Reduce和Filter如何运用?

    - 点击上方"中国统计网"订阅我吧!- 今天给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. Map Map除了地图之外,另一个英文本意是映射 ...

  2. db2 replace函数的用法_5 分钟快速掌握 MySQL 函数

    目录 1.MySQL中关于函数的说明 概念:类似java.python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名: 好处:Ⅰ隐藏了实现细节:Ⅱ提高代码的重用性: 调用:select 函数名 ...

  3. matlab的filter函数,filter函数用法 matlab中filter函数的用法

    matlab中filter函数的用法如果你深爱的人此刻在你身边陪你,你怎么会有时间来看这些文字呢 离散系统的差分方程为 2y[k]-y[-1]-3y[k-2]=2x[k]-x[k-1] x[k]=(0 ...

  4. filter() 函数的用法

    下面通过一个实例来演示 filter() 函数的用法.比如说,定义一个 list 变量,里边放置若干学生的成绩信息(包括语文.数学和英语).要求使用 filter() 函数筛选出偏科的学生名单. 如何 ...

  5. filter函数的用法_动态数组函数系列5| 筛选函数FILTER,单条件多条件动态筛选

    FILTER函数是筛选函数,就是在源数据中按照我们的条件筛选出我们想要的数据.除了常规的数据筛选,还可以进行多条件的"且"或者"或"的筛选. 下面我们来看看这个 ...

  6. filter函数的用法_函数周期表丨筛选丨表丨CALCULATETABLE

    CALCULATETABLE函数 CALCULATETABLE函数属于"筛选"类函数,隶属于"表函数". 某种意义上来说,CALCULATETABLE函数其实就 ...

  7. filter函数的用法_JavaScript中forEach和filter的用法和原理

    JavaScript中有许多好用的数组方法,例如说forEach,filter...等等 那这些方法是都有什么用途呢?以及自己能否写一个方法出来替代呢? forEach方法 日常用法 ​ 我们拿到一组 ...

  8. filter函数的用法_这几个超牛函数,你的Excel里有没有?

    小伙伴们好啊,今天和大家分享几个Office 365中新函数的典型用法,有了这些新函数,让原本复杂的计算变得越来越简单.1.数据转置如下图所示,为了便于打印,要将A列中的姓名,转换为多行多列.D6单元 ...

  9. es6 filter函数的用法_Python 函数式编程指北,不只是面向对象哦!超级详细!

    Python 函数式编程指北, 不只是面向对象哦 了解在Python中如何使用 lambda, map, filter 和 reduce 函数来转换数据结构 Photo by Markus Spisk ...

最新文章

  1. 三星的 Logo 原来是这么来哦! | 每日趣闻
  2. halcon算子翻译——dev_set_paint
  3. 转载:工程师笔记|STM32F030在低温下无法启动
  4. python3基础学习(双色球随机生成器)
  5. Android安全-SO动态库注入
  6. 发票管理软件_财务人员都在用的这款发票管理软件,真的值得购买么?
  7. 光伏等新能源信用风险事件频繁爆发
  8. Java—集合框架List
  9. markdown居中文本 - 代码篇
  10. HBase常用命令(超全超详细)
  11. 易辅客栈第一套从零学辅助系列教程
  12. WPF——自定义日历
  13. 四、ARDUINO UNO开发板介绍
  14. Java多线程系列--【JUC集合02】- CopyOnWriteArrayList
  15. MarkDown学习备忘录
  16. 极狐GitLab Helm Registry 使用指南
  17. mysql从创库到查询基本命令
  18. linux环境查看cpu是否开启睿频
  19. 测试人的Java之编程那点事
  20. 最短路及最短路计数(SPFA)

热门文章

  1. linux 英伟达 分辨率,配置nVidia显卡修改Ubuntu分辨率
  2. Jenkins2021持续部署
  3. Python 为啥不建议使用 thread模块?
  4. 卷积网络的学习(卷积核,通道,padding,stride等概念)
  5. 各种说明方法的例句_说明方法和例句
  6. java 同步块 抛出异常_java问题合集(一)
  7. Clion生成动态链接库.dll
  8. java 取字符的ascii_如何用java获得字符串的ASCII值
  9. TVS二极管挑选法宝,聪明的你看看也知道
  10. NUP2105L CAN BUS总线端口静电保护器件