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 10 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
python多进程并行代码实例
Sep 30 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
Python pandas对excel的操作实现示例
Jul 21 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
Python爬虫新手入门之初学lxml库
Dec 20 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 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
vue数据控制视图源码解析
2018/03/28 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python字符串编码识别模块chardet简单应用
2015/06/15 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Django中提示消息messages的设置方式
2019/11/15 Python
Python实现直播推流效果
2019/11/26 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Python count函数使用方法实例解析
2020/03/23 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
PHP面试题及答案一
2012/06/18 面试题
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
工程进度款催款函
2015/06/24 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript