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多线程、锁、event事件机制的简单使用
Apr 27 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
python使用response.read()接收json数据的实例
Dec 19 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
详解python中的index函数用法
Aug 06 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python yield和Generator函数用法详解
Feb 10 Python
python实现信号时域统计特征提取代码
Feb 26 Python
如何查看python关键字
Jan 17 Python
python基于tkinter制作无损音乐下载工具
Mar 29 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
Yii2中DropDownList简单用法示例
2016/07/18 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python中的global关键字的使用方法
2019/08/20 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Python如何解除一个装饰器
2020/08/07 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
大学生预备党员自我评价分享
2013/11/16 职场文书
广告创意求职信
2014/03/17 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
贷款承诺书
2015/01/20 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
Python绘制分类图的方法
2021/04/20 Python
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
pt-archiver 主键自增
2022/04/26 MySQL