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通过pil模块获得图片exif信息的方法
Mar 16 Python
Python Property属性的2种用法
Jun 21 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
Django框架 querySet功能解析
Sep 04 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
django中cookiecutter的使用教程
Dec 03 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python和C语言混合编程实例
2014/06/04 Python
Python中运行并行任务技巧
2015/02/26 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
python opencv实现简易画图板
2020/08/27 Python
大学系主任推荐信范文
2013/12/24 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
英雄儿女观后感
2015/06/09 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书