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 21 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
python中format()函数的简单使用教程
Mar 14 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
对python模块中多个类的用法详解
Jan 10 Python
Python中如何添加自定义模块
Jun 09 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python爬虫爬取图片的简单代码
Jan 18 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
pymysql 开启调试模式的实现
2019/09/24 Python
python打开使用的方法
2019/09/30 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
PHP如何自定义函数
2016/09/16 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
英语教学随笔感言
2014/02/20 职场文书
合作意向书范本
2014/03/31 职场文书
班训口号大全
2014/06/18 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
教师师德承诺书2016
2016/03/25 职场文书