在Python和数据科学面试中,经常会遇到一些中级话题。本系列文章旨在帮助那些已经掌握了Python基础知识、希望进一步提升的有志数据科学家。今天将继续探讨一个重要的主题:映射(Map)、归约(Reduce)和过滤(Filter)。
简而言之,映射(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’)?”。
归约操作接受一个条件,并将该条件应用于输入,使输出“归约”为单个值。
先尝试“常规”方法。想要找到列表中所有值的乘积。在正常情况下,会这样做:
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(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上联系:
电子邮件: |