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 相关文章推荐
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
Python发送email的3种方法
Apr 28 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python 正则表达式实现计算器功能
Apr 29 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
用Python实现读写锁的示例代码
Nov 05 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Python pip 常用命令汇总
Oct 19 Python
python中的对数log函数表示及用法
Dec 09 Python
Python anaconda安装库命令详解
Oct 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
Terran兵种介绍
2020/03/14 星际争霸
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
php的hash算法介绍
2014/02/13 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
php实现头像上传预览功能
2017/04/27 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
python里对list中的整数求平均并排序
2014/09/12 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
幼师大班个人总结
2015/02/13 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
党员转正申请报告
2015/05/15 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书