Python中的高级函数map/reduce使用实例


Posted in Python onApril 13, 2015

Python内建了map()和reduce()函数。

如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。

我们先看map。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

Python中的高级函数map/reduce使用实例

现在,我们用Python代码实现:

>>> def f(x):

...     return x * x

...

>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。

你可能会想,不需要map()函数,写一个循环,也可以计算出结果:

L = []

for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:

    L.append(f(n))

print L

的确可以,但是,从上面的循环代码,能一眼看明白“把f(x)作用在list的每一个元素并把结果生成一个新的list”吗?

所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])

['1', '2', '3', '4', '5', '6', '7', '8', '9']

只需要一行代码。

再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

比方说对一个序列求和,就可以用reduce实现:
>>> def add(x, y):

...     return x + y

...

>>> reduce(add, [1, 3, 5, 7, 9])

25

当然求和运算可以直接用Python内建函数sum(),没必要动用reduce。

但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579,reduce就可以派上用场:

>>> def fn(x, y):

...     return x * 10 + y

...

>>> reduce(fn, [1, 3, 5, 7, 9])

13579

这个例子本身没多大用处,但是,如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:
>>> def fn(x, y):

...     return x * 10 + y

...

>>> def char2num(s):

...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

...

>>> reduce(fn, map(char2num, '13579'))

13579

整理成一个str2int的函数就是:
def str2int(s):

    def fn(x, y):

        return x * 10 + y

    def char2num(s):

        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

    return reduce(fn, map(char2num, s))

还可以用lambda函数进一步简化成:
def char2num(s):

    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):

    return reduce(lambda x,y: x*10+y, map(char2num, s))

也就是说,假设Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!
Python 相关文章推荐
Python正则捕获操作示例
Aug 19 Python
Python全排列操作实例分析
Jul 24 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
Python字节单位转换实例
Dec 05 Python
python实现最速下降法
Mar 24 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
举例讲解Python装饰器
Dec 24 Python
python链表类中获取元素实例方法
Feb 23 Python
Python图片检索之以图搜图
May 31 Python
Python 数据可视化之Bokeh详解
Nov 02 Python
Python遍历目录的4种方法实例介绍
Apr 13 #Python
用Python生成器实现微线程编程的教程
Apr 13 #Python
Python字符串处理函数简明总结
Apr 13 #Python
Python日志模块logging简介
Apr 13 #Python
Python命令行参数解析模块optparse使用实例
Apr 13 #Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 #Python
Python随机生成数模块random使用实例
Apr 13 #Python
You might like
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Python常用模块sys,os,time,random功能与用法实例分析
2020/01/07 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
领导干部保密承诺书
2014/08/30 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
《花钟》教学反思
2016/02/17 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android