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 pdb调试方法分享
Jan 21 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python查找第n个子串的技巧分享
Jun 27 Python
Django中的文件的上传的几种方式
Jul 23 Python
Python发展简史 Python来历
May 14 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
在Django中实现添加user到group并查看
Nov 18 Python
python实现画出e指数函数的图像
Nov 21 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
Python代码注释规范代码实例解析
Aug 14 Python
python excel和yaml文件的读取封装
Jan 12 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 Document 代码注释规范
2009/04/13 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
JavaScript arguments 多参传值函数
2010/10/24 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
vue项目中锚点定位替代方式
2019/11/13 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
Django REST 异常处理详解
2020/07/15 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
python 批量将中文名转换为拼音
2021/02/07 Python
都柏林通行卡/城市通票:The Dublin Pass
2020/02/16 全球购物
体育教师自我鉴定
2014/02/12 职场文书
《阳光》教学反思
2014/02/23 职场文书
2014年党支部承诺书
2014/05/30 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
党员争先创优承诺书
2015/01/20 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
2016年端午节寄语
2015/12/04 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
python unittest单元测试的步骤分析
2021/08/02 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis