Python学习系列之Map,Reduce和 Filter

mapreduce(python开发) 开发mapreduce 简介: MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义: (1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。 (2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任 阅读详情

Map,Filter 和 Reduce 三个高阶函数能为函数式编程提供便利。

首先看一下什么是MapReduce?

摘自wiki中关于MapReduce的解释:

MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。

当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组。 

简单来说,一个映射函数就是对一些独立元素组成的概念上的列表(例如,一个测试成绩的列表)的每一个元素进行指定的操作(比如,有人发现所有学生的成绩都被高估了一分,他可以定义一个“减一”的映射函数,用来修正这个错误)。事实上,每个元素都是被独立操作的,而原始列表没有被更改,因为这里创建了一个新的列表来保存新的答案。这就是说,Map操作是可以高度并行的,这对高性能要求的应用以及并行计算领域的需求非常有用。
而归纳操作指的是对一个列表的元素进行适当的合并(继续看前面的例子,如果有人想知道班级的平均分该怎么做?他可以定义一个归纳函数,通过让列表中的奇数(odd)或偶数(even)元素跟自己的相邻的元素相加的方式把列表减半,如此递归运算直到列表只剩下一个元素,然后用这个元素除以人数,就得到了平均分)。虽然他不如映射函数那么并行,但是因为归纳总是有一个简单的答案,大规模的运算相对独立,所以归纳函数在高度并行环境下也很有用。

一、Map

1.1 定义及基础用法

Map会将一个函数映射到一个输入序列的所有元素上。Map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()了。

不同长度的多个seq是无法执行map函数的,会出现类型错误。

基础语法:

map(function_to_apply, list_of_inputs)
map(*function*, *iterable*, *...*) -> list

参数:

function_to_apply:映射函数,也就是处理输入迭代类型的的每一个元素的函数。

list_of_inputs:一个或多个序列。输入的序列类型:列表,集合,元组,字典及字符串。

返回值: 

    Python2 :map直接返回列表,不管输入的迭代类型是列表,集合,元组,字典还是字符串类型。

    Python3:map返回迭代器,可以利用list()转为列表,只能转为列表,set(), tuple()等函数不起作用。

Iterator是惰性序列,因此通过list函数让它把整个序列都计算出来并返回一个list。

示例:

Python 2:

a = [1, 2, 3, 4]
b = map(lambda x: x*2, a)   # 处理列表
Out[4]: [2, 4, 6, 8]

b = map(lambda x: x*2, (1,2,3))  # 处理元组
Out[6]: [2, 4, 6]

b = map(lambda x: x*2, {1:2, 3:4, 5:6})  # 处理字典,只处理键
Out[8]: [2, 6, 10]
b = map(lambda x: x*2, {1:2, 3:4, 5:6}.keys())
Out[17]: [2, 6, 10]

b = map(lambda x: x*2, {1:2, 3:4, 5:6}.values())
Out[15]: [4, 8, 12]

b = map(lambda x: x*2, set([1, 2, 3, 4]))  # 处理集合
Out[11]: [2, 4, 6, 8]

b = map(lambda x: x+"1", "12345") # 处理字符串,字符串也是迭代类型
Out[19]: ['11', '21', '31', '41', '51']

Python 3

>>> a = [1, 2, 3, 4]
>>> b = map(lambda x: x*2, a)   # 处理列表
>>> b
<map object at 0x0000000002B68A20>   # map对象
>>> list(b)
[2, 4, 6, 8]

1.2 高级用法

1.2.1 处理多个序列

想要输入和处理多个序列,需要可以支持多个参数的函数,注意的是各序列的长度必须一样,否则报错。
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
>>> map(add,'zhoujy','Python','test')     #'test'的长度比其他2个小
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (3 given)

 

单个序列:seq中的每个元素都经过了func函数的作用,得到了func(seq[n])组成的列表。

 

多个序列:每个seq的同一位置的元素在执行过一个多元的func函数之后,得到一个返回值,这些返回值放在一个结果列表中。

print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6] )  # [4, 10, 18]
print map( lambda x, y: ( x * y, x + y), [1, 2, 3], [4, 5, 6] )  # [(4, 5), (10, 7), (18, 9)]

 返回值是一个值,也可以是一个元组。

1.2.2 处理函数序列

大多数时候,我们使用匿名函数(lambdas)来配合map,  不仅可以用于一序列的输入, 也可以用于一列表的函数。

def multiply(x):
        return (x*x)
def add(x):
        return (x+x)

funcs = [multiply, add]
for i in range(5):
    value = map(lambda x: x(i), funcs)
    print(list(value))
    # 译者注:上面print时,加了list转换,是为了python2/3的兼容性
    #        在python2中map直接返回列表,但在python3中返回迭代器
    #        因此为了兼容python3, 需要list转换一下

# Output:
# [0, 0]
# [1, 2]
# [4, 4]
# [9, 6]
# [16, 8]

二、Reduce

2.1 定义及基础用法

       reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(列表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果,逐步迭代。

   也就是reduce函数把前两个元素的计算结果继续和序列的下一个元素做累积计算,直到处理完所有元素,返回结果。以下两个函数等价:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

基本语法:

reduce(function, iterable[, initializer])
reduce(*function*, *iterable*[, *initializer*]) -> value

参数:

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数。第一次时为init的元素,如没有init则为seq的第一个元素。

返回值:

返回函数计算结果。

示例:

>>>def add(x, y) :            # 两数相加
...     return x + y
... 
>>> reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
15

上述执行过程是:1+2=3,3+3=6,6+4=10,10+5=15。

2.2 高级用法

2.2.1 处理函数序列

使用匿名函数(lambdas)来配合reduce,  不仅可以用于一序列的输入, 也可以用于一个函数序列,但是要注意lambda表达式的参数是两个。

def multiply(x):
    return (x * x)


def add(x):
    return (x + x)


funcs = [multiply, add]
    for i in range(5):
        value = reduce(lambda x, y: x(i) + y(i), funcs)
        print(value)

0
3
8
15
24

三、Filter

3.1 定义及基础用法    

Python 2:      

 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

Python 3:

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换,利用set转换为集合,tuple转换为元组,str转为字符串。

另外注:集合是{},列表是[],元组是(),字典是{k1:v1, k2:v2}。

       注意: Pyhton2.7 返回列表,Python3.x 返回迭代器对象。

       Filter是一个内置函数,并且比for循环更快。

基本语法:

filter(function, iterable)
filter(function or None, sequence) -> list, tuple, or string

参数:

       其接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

  • function -- 判断函数。过滤序列中每个元素的函数。
  • iterable -- 可迭代对象。需要过滤的序列。

返回值:

       Python 2:返回序列,不只是列表,也可能是元组,字符串。

       列表,集合,字典返回列表,元组返回元组,字符串返回字符串。字典处理键。

       Python 3:返回一个迭代器对象,filter object(filter对象)。

Python3 中返回到是一个 filter 类对象。filter 类实现了 __iter__ 和 __next__ 方法, 可以看成是一个迭代器, 有惰性运算的特性(类似于生成器), 相对 Python2.x 提升了性能, 可以节约内存。

a = filter(lambda x: x % 2 == 0, range(10))
print(a)

输出:

<filter object at 0x0000022EC66BB128>

示例:

Python 2:

过滤出列表中的所有奇数:

def is_odd(n):
    return n % 2 == 1
 
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)

[1, 3, 5, 7, 9]

Python 3:

def is_odd(n):
    return n % 2 == 1
 
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)

[1, 3, 5, 7, 9]

四、总结:

(1)map函数和map函数与MapReduce的机制原理相同。map函数对序列的每一个元素进行处理,而resuce函数则两两迭代逐步计算。

(2)reduce函数和filter函数只能处理一个序列。

(3)注意在 python2 和 python3 中,map/reduce/filter 的返回值类型有所不同,python2 返回的是基本数据类型,而 python3 则返回了迭代器。

(4)filter函数很容易被for循环和for in if推导式所替代。

Python中强大的函数: map()、filter() 和 reduce() 概述 Python 包含许多预定义的内置函数,最终用户可以通过简单地调用它们来使用它们。这些功能不仅使程序员的工作更轻松,而且有助于建立一个通用的编码环境。在本教程中,您将了解 Python 的三个最强大的函数:map()、filter() 和 reduce()。 函数式编程的三大支柱是 map、filter 和 reduce 函数。虽然 Python 不完全是一种函数式编程语言,但它确实有很多特性使它如此。本文讨论了 Python 中的 map、filter 和 reduce 函数,以及它们如何对应于函数 阅读详情

相关推荐

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 517

python内置函数map/filter/reduce详解

在Python中,map(), filter(), 和 reduce() 是内置的高级函数(实际是class),用于处理可迭代对象(如列表、元组等)的元素。这些函数通常与lambda函数一起使用,以简洁地表达常见的操作。下面我将分别解释这三个函数。

kymppcds的博客 1650

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3826

【Python】基于Python的MapReduce

针对在100GB级别的大型文件中进行数据检索,使用MapReduce解决内存占用过高、IO效率低下等问题

Ctrl + C / Ctrl + V 人生 1431

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

Python中map、filter和reduce的使用总结

在Python中我们常常会遇到需要使用map、filter和reduce三大函数的情况,大家知道分别在什么情况下使用它们吗?下面我们来逐一学习并理解Python中map、filter和reduce的使用,一起来看看吧!

Python栈 1117

ccSwitch 安装使用指南,claude code的最佳搭档

ccSwitch 是一款真正为 AI 编程开发者打造的效率工具。它把原本繁琐的配置管理工作,简化成了直观的图形界面操作。无论你是需要在多个 API 提供商之间切换,还是想要统一管理多款 AI 编程工具,ccSwitch 都能帮你大幅提升效率。如果你是重度 AI 编程工具用户,强烈推荐尝试一下 ccSwitch,相信它会成为你开发工具箱中不可或缺的一员。项目地址。

篮球界最会写bug的人;程序猿中打球最菜的人。 1289

python学习系列之map、filter、reduce

三个函数比较类似,都是应用于序列的内置函数。常见的序列包括list、tuple、str。 1.map函数 map函数会根据提供的函数对指定序列做映射。 map函数的定义: map(function, sequence[, sequence, ...]) -> list 通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一

余味Uyoung 401

异步处理优化:多线程线程池与消息队列的选择与应用

本文讨论了两种常见的异步处理方式:多线程线程池和消息队列(MQ)。通过将非核心逻辑异步化,可以提升系统的性能和响应速度。多线程线程池适用于本地并发任务,适合需要快速响应的场景,但无法处理跨服务任务。消息队列则适用于分布式系统,能够解耦服务并保证任务的可靠性和顺序性,适合处理高并发和高可靠性要求的任务。文章提供了实际代码示例,帮助开发者根据业务需求选择合适的异步处理方式。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3534

python中map、filter和reduce的区别

1、map(类) 原型: map(func, *iterables) --> map object func: 一个函数 *iterables: 一个可迭代对象 将iterables中的每个值带入到func函数中执行,返回一个map对象。 如: a = [1, 2, -3, 2, -5, -9, 6] b = map(abs, a) print(list(b)) 结果: [1, 2, 3,...

Hyellice的博客 899

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 479

《Python进阶系列》三:Python中的 Map,Filter 和 Reduce用法

Map,Filter和Reduce是函数式编程的范例。 它们使程序员可以编写更简单,更短的代码,而不必担心诸如循环和分支之类的复杂问题。 这三个函数可以将一个函数应用于多个可迭代对象。

一起加油~ 1213

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python中的 Map,Filter 和 Reduce用法

reduce()将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce() 中的 function函数 (有两个参数)先对集合中的第1和2个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。另外,由于仅需要一个可迭代的函数,因此隐含的是func必须仅接受一个参数。func是对iterable中的每个元素累积应用的函数,而initial是在计算中置于iterable元素之前的可选值,并且在iterable为空时用作默认值。

GMH的博客 1245

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python中map、filter和reduce

文章目录collections类collections.dequecollections.combinationscollections.defaultdictmath类math.fabs(x)math.factorialmath.exp(x)math.sqrt(x)itertools类itertools.combinations()functools类functools.reduce colle...

Stephen的博客 304

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python中filter、map、reduce的区别

用法说明 python中有一些非常有趣的函数,面试的时候可能会遇到。今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理。 lambda 为关键字。filter,map,reduce为内置函数。 lambda:实现python中单行最小函数。 g = lambda x: x * 2 #相当于 def g(x): return x*2 f...

python学习者的博客 524

Python之Map,Reduce和 Filter

一、Map 1.1 定义及基础用法 Map会将一个函数映射到一个输入序列的所有元素上。Map()会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。 func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()了。 不...

XTY00的博客 426

python filter map reduce_Python之filter、map、reduce函数

简介三函数:高阶函数:一个函数可以接收另一个函数作为参数,这种函数称之为高阶函数。filter、map、reduce三个函数都是高阶函数,且语法都一致:filter/map/reduce(func,seq),第一个参数为函数,第二个参数为可迭代对象。下面分别介绍三个函数的功能:•filterfilter(func,seq)为过滤函数,此函数的执行原理为将func作用于seq中的每一个元素,返回符合...

weixin_39859052的博客 202

如何用Map、Filter和Reduce替换Python For循环?

2020-01-06 17:00:00 全文共2375字,预计学习时长7分钟 图源:Unsplash 屏幕前的你,瞅瞅看,你的代码是不是通篇都是For循环?是不是眯眼靠近屏幕才能看清自己的代码? 没错,我就是这样的。(难以切齿) For循环是解决问题的瑞士军刀,非常好用,但是当浏览代码想看看自己做了什么的时候,它们会把你淹没。 此时,Map, filte...

喜欢打酱油的老鸟 703

什么是Python中的map,reduce和filter?

基本上,lambdas以及map,reduce和filter为python提供了函数式编程能力。让我们看看他们是什么。 map: map函数采用 iterable(list,tuple,set)并将函数应用于列表中的每个元素。让我们看一个例子来看看它是如何工作的。 任务1:给定一个整数列表,编写代码,以方的所有数s在列表中。 def func (num ): “”” 对给定数字进行平方的函...

程序猿在划水 628

python 定义map_Python实用教程系列——高阶函数Map、Filter、Reduce

那个百分十先生:Python实用教程系列——Logging日志模块​zhuanlan.zhihu.com上次推文我们介绍了python中的Logging日志模块的相关知识,这次推文我们将学习一下python中的高阶函数等相关的知识,这些高阶函数我们是非常常见的,比如我们经常使用的Map、Filter、Reduce。一、定义在学习python的基础知识的时候,我们可能会学到一个概念“函数式编程”,我...

weixin_39667041的博客 772

python map filter reduce_Python实用教程系列——高阶函数Map、Filter、Reduce

上次推文我们介绍了python中的Logging日志模块的相关知识——Python实用教程系列——Logging日志模块,这次推文我们将学习一下python中的高阶函数等相关的知识,这些高阶函数我们是非常常见的,比如我们经常使用的Map、Filter、Reduce。一、定义在学习python的基础知识的时候,我们可能会学到一个概念“函数式编程”,我们来看看百度百科的介绍:"函数式编程"是一种"编程...

weixin_39611510的博客 168

python中的map、reduce、filter 用法

一、map函数 map()是 Python 内置的高阶函数,它接收一个函数 f和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数: 因此,我们只需要传入函数f(x)=x*x,就可以利用map()...

彩虹风雨后,成功细节中 517

Python的lambda, filter, reduce 和 map

Lambda 操作 Lambda操作——有些人喜欢,有些人讨厌,还有很多人害怕。当你看完了我们这章的介绍后,我们很自信你会喜欢上它。要不然,你可以去学习Guido van Rossums更喜欢去用的“list comprehensions”(递推式构造列表)了,因为他也不喜欢Lambda, map filter 和reduce。 Lambda操作或者lambda函数是一种创建小型匿名函数的方式...

It’s All Uphill From Here 352
上一篇: Python学习系列之zip函数
下一篇: Python学习系列之字典
answer3lin
博客等级 码龄11年 138粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值