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 03 Python
python获取mp3文件信息的方法
Jun 15 Python
Django应用程序中如何发送电子邮件详解
Feb 04 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
Python 70行代码实现简单算式计算器解析
Aug 30 Python
Python二次规划和线性规划使用实例
Dec 09 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
详细介绍python操作RabbitMq
Apr 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/10/09 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
详解Python如何生成词云的方法
2018/06/01 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
python链表类中获取元素实例方法
2021/02/23 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
优秀党员转正的自我评价
2013/10/06 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
继承权公证书范本
2015/01/23 职场文书
情人节活动总结范文
2015/02/05 职场文书
行政处罚听证告知书
2015/07/01 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android