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读文件逐行处理的示例代码分享
Dec 27 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
python实现神经网络感知器算法
Dec 20 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
python实现蒙特卡罗方法教程
Jan 28 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
django的csrf实现过程详解
Jul 26 Python
python线性插值解析
Jul 05 Python
5款实用的python 工具推荐
Oct 13 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 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
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
Python pass 语句使用示例
2014/03/11 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
浅谈python中get pass用法
2019/03/19 Python
Django框架实现的分页demo示例
2019/05/25 Python
python 搜索大文件的实例代码
2019/07/08 Python
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
StringBuilder和String的区别
2015/05/18 面试题
用Python写一个for循环的例子
2016/07/19 面试题
MYSQL支持事务吗
2013/08/09 面试题
建筑工程技术应届生自荐信
2013/09/27 职场文书
团日活动总结书格式
2014/05/08 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
维稳承诺书
2015/01/20 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
python turtle绘图
2022/05/04 Python
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技