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将秒数转化为时间格式的实例
Sep 16 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
Django用户认证系统 User对象解析
Aug 02 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
详解使用Python下载文件的几种方法
Oct 13 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 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动态柱状图实现方法
2015/03/30 PHP
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
jquery实现从数组移除指定的值
2015/06/24 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
React diff算法的实现示例
2018/04/20 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
Python中subprocess的简单使用示例
2015/07/28 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python实现ping指定IP的示例
2018/06/04 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
python实现小球弹跳效果
2019/05/10 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
django 类视图的使用方法详解
2019/07/24 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
如何基于Python按行合并两个txt
2020/11/03 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
采购部岗位职责
2013/11/24 职场文书
物理研修随笔感言
2014/02/14 职场文书
中学生寄语大全
2014/04/03 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
实习单位推荐信
2015/03/27 职场文书
军事理论课感想
2015/08/11 职场文书