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的几种开发工具介绍
Mar 07 Python
python分析apache访问日志脚本分享
Feb 26 Python
python数据结构之图的实现方法
Jul 08 Python
Python简明入门教程
Aug 04 Python
详解Python3中yield生成器的用法
Aug 20 Python
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Fabric 应用案例
Aug 28 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
python八皇后问题的解决方法
Sep 27 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
pandas 如何分割字符的实现方法
Jul 29 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获取网络上文件
2006/10/09 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
Smarty模板配置实例简析
2019/07/20 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
python 字典(dict)按键和值排序
2016/06/28 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Python 私有函数的实例详解
2017/09/11 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python顺序执行多个py文件的方法
2019/06/29 Python
为什么相对PHP黑python的更少
2020/06/21 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
2015年幼儿园毕业感言
2014/02/12 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
党务公开方案
2014/05/06 职场文书
房产公证书格式
2015/01/26 职场文书
2014年度个人总结范文
2015/03/09 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书