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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
Python中replace方法实例分析
Aug 20 Python
python daemon守护进程实现
Aug 27 Python
python3 shelve模块的详解
Jul 08 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
Oct 29 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
Python3列表List入门知识附实例
Feb 09 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
在python中list作函数形参,防止被实参修改的实现方法
Jun 05 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
在js中使用"with"语句中跨frame的变量引用问题
2007/03/08 Javascript
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
Python中的文件和目录操作实现代码
2011/03/13 Python
python爬取网站数据保存使用的方法
2013/11/20 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Python魔法方法功能与用法简介
2019/04/04 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
家长对孩子的评语
2014/04/18 职场文书
社区文艺活动方案
2014/08/19 职场文书
立春观后感
2015/06/18 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
Golang ort 中的sortInts 方法
2022/04/24 Golang
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis