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中的列表推导浅析
Apr 26 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
Python中property函数用法实例分析
Jun 04 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
python+Splinter实现12306抢票功能
Sep 25 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
pandas ix &iloc &loc的区别
Jan 10 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
Python如何实现邮件功能
May 27 Python
python包的导入方式总结
Mar 02 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 session 错误
2009/05/21 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
Vue精简版风格概述
2018/01/30 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
Python实现FM算法解析
2019/06/18 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Django models.py应用实现过程详解
2019/07/29 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
应届毕业生求职信
2013/11/30 职场文书
校园招聘策划书
2014/01/09 职场文书
超市重阳节活动方案
2014/02/10 职场文书
中国入世承诺
2014/04/01 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
助学贷款贫困证明
2014/09/23 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
英文升职感谢信
2015/01/23 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
简历中自我评价范文
2015/03/11 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
python Polars库的使用简介
2021/04/21 Python