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中的线程进行网络编程的入门教程
Apr 15 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
python脚本开机自启的实现方法
Jun 28 Python
python绘制多个子图的实例
Jul 07 Python
python logging模块的使用总结
Jul 09 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Python random模块的使用示例
Oct 10 Python
Restful_framework视图组件代码实例解析
Nov 17 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
PHP排序算法类实例
2015/06/17 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
对python字典过滤条件的实例详解
2019/01/22 Python
Django model update的多种用法介绍
2020/03/28 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python 如何在测试中使用 Mock
2021/03/01 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
大学生翘课检讨书范文
2014/10/06 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
MySQL添加索引特点及优化问题
2022/07/23 MySQL