Python中的高效编程:Lambda/Map/Filter/Sorted

Python中的高效编程:Lambda/Map/Filter/Sorted

在Python的匿名函数中使用lambda函数是非常有用的。匿名函数是没有名称的函数,但不要误解,Lambda也可以在带有名称的函数中使用。

我喜欢使用Lambda,因为它使程序非常简洁,仍然清晰易懂,此外,它不会使程序变慢。

语法是这样的:

lambda x,…. : expression

我在x后面加了几个点来表示更多的参数。Lambda可以接受任意数量的参数,但只能接受一个表达式。让我们看一些用例。

这是一个函数,它接受一个参数x并返回x²。

def squared(x):
     return x*x

现在使用lambda编写相同的函数。

squared = lambda x: x*x

这两个平方函数是完全一样的。现在看一个简单的加法函数,其中函数有两个参数:

add = lambda x, y: x+y
#Calling the function add
add(4, 5)
output: 9

Map

Python中的Map函数接受列表和一个函数,并返回由该函数修改的列表。让我们看一些例子。这里有三个列表a、b和c。

a = [3,4,5,2,7,8]
b = [7,9,2,4,5,1]
c = [5,7,3,4,5,9]

调用列表a和列表b上的添加函数:

add(a,b)
Output: [3, 4, 5, 2, 7, 8, 7, 9, 2, 4, 5, 1]

这并不是一个元素相加的方式,我们的加法函数以它应该的方式来加数字。但当涉及到列表时,它只是生成一个更大的列表,其中包含两个列表的所有元素。

通常,我们做元素添加的方法是使用“for循环”,如下所示:

res = []for i in range(0, len(a)):
    res.append(a[i]+ b[i])

使用“map”,你可以在列表a和列表b上调用这个添加函数来获得元素相加。它的工作原理就像一个“for循环”。

list(map(add, a, b))

这样不是更简洁和优雅吗? 更好的方法是同时使用lambda和map。你可以在一行代码中定义函数并同时调用它:

list(map(lambda x, y: x+y, a, b))

事实上,你可以添加这三个列表或者任意多的参数:

list(map(lambda x, y, z: x+y+z, a, b, c))

如果你有一个使用三个参数的公式:

list(map(lambda x, y, z: 2*x + 2.5*y + z, a, b, c))
Filter

过滤器以列表作为参数,以函数作为表达式。它通过函数过滤掉元素后返回修改后的列表。这里有一些例子,

只返回列表中大于5的数字。

list(filter(lambda x: x>5, c))

这里我传递了c作为参数。只返回列表中的偶数。这次我将通过列表a。list(filter(lambda x: x%2==0, a))

上面的例子都是有数字的。接下来的几个例子是关于字符串的。这是一个名单的名字:

names = [‘Abram’, ‘Arib’, ‘Bob’, ‘Shawn’, ‘Aria’, ‘Cicilia’, ‘John’, ‘Reema’, ‘Alice’, ‘Craig’, ‘Aaron’, ‘Simi’]

返回所有以’ A ‘开头的名称:

list(filter(lambda x: x[0]!=’A’, names))
Sorted

sorted函数是一种非常简单的按字母排序数字或字符串的方法。这里有一些例子。

使用第一个字母对下面列表的名称进行排序:

sorted(names, key=lambda x: x[0])
output:
[‘Abram’, ‘Arib’, ‘Aria’, ‘Alice’, ‘Aaron’, ‘Bob’, ‘Cicilia’, ‘Craig’, ‘John’, ‘Reema’, ‘Shawn’, ‘Simi’]

它是行得通。但更好的选择是:

sorted(names)
Output:
[‘Aaron’, ‘Abram’, ‘Alice’, ‘Aria’, ‘Arib’, ‘Bob’, ‘Cicilia’, ‘Craig’, ‘John’, ‘Reema’, ‘Shawn’, ‘Simi’]

这样,名字就按字母顺序排列。同样的方法也适用于列表。

sorted(c)
Output:
[3, 4, 5, 5, 7, 9]

在dictionary(字典)上用Lambda, Map, Filter, and Sorted

使用lambda、map、filter和sort,处理字典要简单得多,效率也高得多。

这里是一个有四个字典的列表。每本词典由一个人的名字和他或她的年龄组成。

dict_a = [{‘name’: ‘John’, ‘age’: 12},
{‘name’: ‘Sonia’, ‘age’: 10},
{‘name’: ‘Steven’, ‘age’: 13},
{‘name’: ‘Natasha’, ‘age’: 9}]

从上面的列表中返回只有名字的列表:

list(map(lambda x: x[‘name’], dict_a))
Output:
[‘John’, ‘Sonia’, ‘Steven’, ‘Natasha’]

同样的,你可以只从a输出年龄:

list(map(lambda x: x[‘age’], dict_a))

如果你想让名字按字母排序或“年龄”列表排序,只需在前面放一个排序:

sorted(list(map(lambda x: x[‘age’], dict_a)))
Output:
[9, 10, 12, 13]

你可能会想,按年龄排序可能更有用。在这种情况下,我们只需要使用键与lambda:

sorted(dict_a, key=lambda x: x[‘age’])
Output:
[{‘name’: ‘Natasha’, ‘age’: 9},
{‘name’: ‘Sonia’, ‘age’: 10},
{‘name’: ‘John’, ‘age’: 12},
{‘name’: ‘Steven’, ‘age’: 13}]

输出最小的孩子的信息:

sorted(dict_a, key=lambda x: x[‘age’])[0]
Output:
{‘name’: ‘Natasha’, ‘age’: 9}

输出最大的孩子的信息:

sorted(dict_a, key=lambda x: x[‘age’])[-1]
Output:
{‘name’: ‘Steven’, ‘age’: 13}

如果我们需要列表按降序排列,就不要按升序排列:

sorted(dict_a, key=lambda x: x[‘age’], reverse =True)
Output:
[{‘name’: ‘Steven’, ‘age’: 13},
{‘name’: ‘John’, ‘age’: 12},
{‘name’: ‘Sonia’, ‘age’: 10},
{‘name’: ‘Natasha’, ‘age’: 9}]

或者,如果你想按名字的字母顺序排序:

sorted(dict_a, key=lambda x: x[‘name’])

输出10岁以上儿童的信息:

list(filter(lambda x: x[‘age’]>10, dict_a))
Output:
[{‘name’: ‘John’, ‘age’: 12},{‘name’: ‘Steven’, ‘age’: 13}]

三年后你会返回孩子的年龄。所以,每个年龄加3:

list(map(lambda x: x[‘age’]+3, dict_a))
Output:
[15, 13, 16, 12]

这里是YouTube视频教程

https://www.youtube.com/watch?v=pgCDnti1Yp4.

原文作者:Rashida Nasrin Sucky

翻译作者:Sophie Li

美工编辑:过儿

校对审稿:Dongdong

原文链接:https://towardsdatascience.com/lambda-map-filter-and-sorted-efficient-programming-with-python-15d45bc1912a