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的lambda语句声明匿名函数的用法
Jul 01 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
PYTHON基础-时间日期处理小结
May 05 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
Python数据类型之List列表实例详解
May 08 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
Dec 04 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
python手写均值滤波
Feb 19 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 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中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
详解php协程知识点
2018/09/21 PHP
PHP attributes()函数讲解
2019/02/03 PHP
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
百度地图api如何使用
2015/08/03 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
nodejs基础知识
2017/02/03 NodeJs
Vue.js2.0中的变化小结
2017/10/24 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
python爬取指定微信公众号文章
2018/12/20 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Python如何给你的程序做性能测试
2020/07/29 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
施工材料员岗位职责
2014/02/12 职场文书
死亡证明书样本说明
2014/10/18 职场文书
工作失职自我检讨书
2015/05/05 职场文书
python 实现体质指数BMI计算
2021/05/26 Python