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写一个windows下的定时关机脚本(推荐)
Mar 21 Python
python中abs&map&reduce简介
Feb 20 Python
浅谈python中字典append 到list 后值的改变问题
May 04 Python
python判断设备是否联网的方法
Jun 29 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Python多进程编程常用方法解析
Mar 26 Python
关于python中模块和重载的问题
Nov 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服务器页面间跳转实现方法
2012/08/02 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
php微信开发之百度天气预报
2016/11/18 PHP
PHP微商城开源代码实例
2019/03/27 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
用jquery来定位
2007/02/20 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
python不带重复的全排列代码
2013/08/13 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
python中的字典使用分享
2016/07/31 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
keras.layer.input()用法说明
2020/06/16 Python
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
《开国大典》教学反思
2014/04/19 职场文书
硕士研究生就业推荐信
2014/05/18 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
党员剖析材料范文
2014/12/18 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL