Python中级概念:映射、归约和过滤

Python数据科学面试中,经常会遇到一些中级话题。本系列文章旨在帮助那些已经掌握了Python基础知识、希望进一步提升的有志数据科学家。今天将继续探讨一个重要的主题:映射(Map)、归约(Reduce)和过滤(Filter)。

映射(Map)

简而言之,映射(Map)将一个函数或某种操作应用于特定输入的所有项,并反映所有输入元素的变化。

例如,如何将给定列表中的所有元素平方?先来看一个“常规”方法。

items = [1, 2, 3, 4, 5] squared = [] for i in items: squared.append(i**2) squared # 输出: [1, 4, 9, 16, 25]

现在,尝试使用映射方法。映射方法的语法如下:

map(operation_to_perform, list_of_inputs_for_the_operation)

这里的“operation_to_perform”可以被描述为想要对列表或其他形式的输入执行的操作。映射函数的第二部分以列表、元组等形式接收输入。然后,由“operation_to_perform”描述的操作被实例化。让通过一个例子来看实际操作。

items = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, items)) squared # 输出: [1, 4, 9, 16, 25]

但是,等等!这里的lambda是做什么的?

Python官方文档定义lambda为:lambda表达式(有时称为lambda形式)用于创建匿名函数。表达式lambda参数:表达式产生一个函数对象。

通常定义函数的方式是这样的:

def function_name(): # 函数体

但是lambda是一个“一次性使用”的无名称函数。它们在map()或filter()函数中执行快速操作。一旦工作完成,它们就不存在了。

但是,何时使用def(),何时使用lambdas呢?Stackoverflow上有关于这个话题的有趣讨论/回答。可以查看“Which is more preferable to use: lambda functions or nested functions (‘def’)?”。

归约(Reduce)

归约操作接受一个条件,并将该条件应用于输入,使输出“归约”为单个值。

先尝试“常规”方法。想要找到列表中所有值的乘积。在正常情况下,会这样做:

product = 1 list = [1, 2, 3, 4] for num in list: product = product * num product # 输出: 24

现在,尝试“归约”方法:

from functools import reduce product = reduce((lambda x, y: x * y), [1, 2, 3, 4]) product # 输出: 24

注意,取列表并通过定义条件(x*y)执行lambda操作。问题因此被归约为一个单一值。

顺便说一下,在这里导入了functools。Functools基本上是一个“高阶函数”,它在其他函数上工作。可能已经猜到了,它是内置的。它与其他函数一起工作,而无需完全重写它们。类似于functools,还有一个叫做itertools的东西,它的主要工作是为高效循环创建迭代器。

过滤(Filter)

顾名思义,过滤方法根据给定条件过滤元素。过滤方法的工作程序相当直接。该函数检查某个条件,并决定输入中的每个元素是否满足给定条件。检查条件后,函数相应地验证真或假。

语法:

filter(function, input)

参数:

  • function: 测试每个元素是否满足条件的函数。
  • input: 需要被过滤的输入,可以是集合、列表、元组或任何迭代器容器。

返回值:返回一个已经过滤的迭代器。

假设有一个数字列表,想要过滤“小”数字。在这种情况下,小意味着小于5的数字。如何应用“filter”来获得结果?

li = [1,2,3,4,5,6,7,8,9,10] small = list(filter(lambda x: x < 5, li)) print(small) # 输出: [1,2,3,4]

让再试一个例子,只过滤负数。

number_list = range(-5, 5) less_than_zero = filter(lambda x: x < 0, number_list) next(less_than_zero) # 输出: -5 next(less_than_zero) # 输出: -4 next(less_than_zero) # 输出: -3 next(less_than_zero) # 输出: -2 next(less_than_zero) # 输出: -1 next(less_than_zero) # StopIteration

因为那就是全部。过滤后的列表只包含[-5, -4, -3, -2, -1]。

映射、归约和过滤表达式无疑是任何希望超越基础的Python开发者必须理解的最重要的概念之一。此外,为了在大数据中进行高效计算,作为数据科学家,详细理解这个概念非常重要。实践是关键!

好!叫Akash,已经作为Python开发者工作了4年多。在职业生涯中,最初是尼泊尔最大的求职门户网站Merojob的初级Python开发者。后来,参与了尼泊尔第一家拼车公司Tootle的数据科学和研究。目前,一直在积极参与数据科学以及使用Django的Web开发。

可以在GitHub上找到其他项目:

在LinkedIn上联系:

电子邮件: |

  • **args和**kwargs在2分钟内
  • 生成器和迭代器在2分钟内
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485