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中计算三角函数之cos()方法的使用简介
May 15 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Python打印输出数组中全部元素
Mar 13 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python多线程同步之文件读写控制
Feb 25 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
python使用Geany编辑器配置方法
Feb 21 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 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 for 循环语句使用方法详细说明
2010/05/09 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
js实现常用排序算法
2016/08/09 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
webpack构建的详细流程探底
2018/01/08 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
Python之指数与E记法的区别详解
2019/11/21 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
Final类有什么特点
2012/04/25 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
数控专业大学生的自我鉴定
2013/11/13 职场文书
特色蛋糕店创业计划书
2014/01/28 职场文书
同学会主持词
2014/03/18 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
学习之星事迹材料
2014/05/17 职场文书
校庆口号
2014/06/20 职场文书
片区教研活动总结
2014/07/02 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js