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实现一个简单的MySQL类
Jan 07 Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 Python
Python使用sorted排序的方法小结
Jul 28 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
python使用matplotlib画饼状图
Sep 25 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
python中mongodb包操作数据库
Apr 19 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
用PHP实现维护文件代码
2007/06/14 PHP
php email邮箱正则
2008/10/08 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
Git命令之分支详解
2021/03/02 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
Python实现高斯函数的三维显示方法
2018/12/29 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
质量月活动策划方案
2014/03/10 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
人力资源部工作计划
2019/05/14 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL