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实现文件快照加密保护的方法
Jun 30 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python计算列表内各元素的个数实例
Jun 29 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
使用Python实现画一个中国地图
Nov 23 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
Python日志处理模块logging用法解析
May 19 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
python re.match()用法相关示例
Jan 27 Python
用python删除文件夹中的重复图片(图片去重)
May 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安全配置
2006/12/06 PHP
如何离线执行php任务
2017/02/21 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
JS常用知识点整理
2017/01/21 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python管理Windows服务小脚本
2018/03/12 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
python 字符串只保留汉字的方法
2018/11/16 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
利用python list完成最简单的DB连接池方法
2019/08/09 Python
Python的Lambda函数用法详解
2019/09/03 Python
使用python实现画AR模型时序图
2019/11/20 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
数学专业毕业生自荐信
2013/11/10 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
继承公证书
2014/04/09 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
男性健康日的活动方案
2014/08/18 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
排球赛新闻稿
2015/07/17 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL