Python中的map()函数和reduce()函数的用法


Posted in Python onApril 27, 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()函数,你完全可以自己写一个把字符串转化为整数的函数,而且只需要几行代码!

练习

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。

Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积。

Python 相关文章推荐
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
用Python实现大文本文件切割的方法
Jan 12 Python
python基于递归解决背包问题详解
Jul 03 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
python实现画图工具
Aug 27 Python
python zip()函数的使用示例
Sep 23 Python
PyMongo安装使用笔记
Apr 27 #Python
Windows下PyMongo下载及安装教程
Apr 27 #Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 #Python
Python的函数的一些高阶特性
Apr 27 #Python
Python简单进程锁代码实例
Apr 27 #Python
在Python中使用列表生成式的教程
Apr 27 #Python
讲解Python中的递归函数
Apr 27 #Python
You might like
php使用curl简单抓取远程url的方法
2015/03/13 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
javascript jQuery插件练习
2008/12/24 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
微信小程序 slider 详解及实例代码
2017/01/10 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
详解python里的命名规范
2018/07/16 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
python 基于wx实现音乐播放
2020/11/24 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
社会实践活动总结
2015/02/05 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
volatile保证可见性及重排序方法
2022/08/05 Java/Android