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 29 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
Python中协程用法代码详解
Feb 10 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
python怎么判断模块安装完成
Jun 19 Python
python中如何写类
Jun 29 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
django中cookiecutter的使用教程
Dec 03 Python
Python使用openpyxl批量处理数据
Jun 23 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数组总结篇(一)
2008/09/30 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php显示时间常用方法小结
2015/06/05 PHP
php基本函数汇总
2015/07/09 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
js随机生成一个验证码
2017/06/01 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
Python3.x和Python2.x的区别介绍
2013/02/12 Python
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
python保存文件方法小结
2018/07/27 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
旷课检讨书3000字
2014/02/04 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers
python 字典和列表嵌套用法详解
2021/06/29 Python
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript