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利用matplotlib库绘制饼图的方法示例
Dec 18 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
python 对key为时间的dict排序方法
Oct 17 Python
python集合常见运算案例解析
Oct 17 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
pytorch之添加BN的实现
Jan 06 Python
python实现贪吃蛇游戏源码
Mar 21 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
Vue响应式原理详解
2017/04/18 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python执行时间的计算方法小结
2017/03/17 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
在Pycharm中修改文件默认打开方式的方法
2019/01/17 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
如何编写python的daemon程序
2021/01/07 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
幼教个人求职信范文
2013/12/02 职场文书
投资合作协议书
2014/04/17 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
教师节班会主持词
2015/07/06 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
部分武汉产收音机展览
2022/04/07 无线电