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中的WSGI接口
May 11 Python
在Python的Django框架中simple-todo工具的简单使用
May 30 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Python迭代和迭代器详解
Nov 10 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
解决python flask中config配置管理的问题
Jul 26 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
python脚本框架webpy模板控制结构
Nov 20 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快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
js性能优化技巧
2015/11/29 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
Python内置类型性能分析过程实例
2020/01/29 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python语言是免费还是收费的?
2020/06/15 Python
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
机电工程学生自荐信范文
2013/12/07 职场文书
医院护士的求职信
2014/01/03 职场文书
业务员简历自我评价
2014/03/06 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
2015年化验室工作总结
2015/04/23 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书