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中定义结构体的方法
Mar 04 Python
Python算法应用实战之队列详解
Feb 04 Python
一百多行python代码实现抢票助手
Sep 25 Python
安装python及pycharm的教程图解
Oct 10 Python
Python操作Excel把数据分给sheet
May 20 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
Django权限控制的使用
Jan 07 Python
python状态机transitions库详解
Jun 02 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
2014/06/24 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
Vue.js进阶知识点总结
2018/04/01 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
详细探究Python中的字典容器
2015/04/14 Python
浅析python参数的知识点
2018/12/10 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
垃圾回收的优点和原理
2014/05/16 面试题
促销活动方案模板
2014/02/24 职场文书
空乘英文求职信
2014/04/13 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
大学毕业生个人总结
2015/02/28 职场文书
工作失职自我检讨书
2015/05/05 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL