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控制台显示时钟的示例
Feb 24 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
python爬虫的工作原理
Mar 05 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
python队列原理及实现方法示例
Nov 27 Python
python爬虫添加请求头代码实例
Dec 28 Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 Python
导致python中import错误的原因是什么
Jul 01 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
python如何停止递归
Sep 09 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Django 用户认证组件使用详解
2019/07/23 Python
python实现猜单词游戏
2020/05/22 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
《长相思》听课反思
2014/04/10 职场文书
商务英语专业求职信
2014/06/26 职场文书
保密工作目标责任书
2014/07/28 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
运动会200米广播稿
2015/08/19 职场文书
幼儿园语言教学反思
2016/02/23 职场文书