难以理解排序中的lambda函数
假设我定义了一个列表的列表,叫做 lol
:
lol = [['malasia', 0.02, 56.3], ['chile', 0.03, 34.9],
['hungria', 0.01, 45.9], ['ahumada', 0.001, 1]]
然后,
lol.sort(lambda x, y: cmp(y[2], x[2]))
会根据每个子列表的最后一个元素对 lol
进行排序……
我只是想搞清楚 sort
的各个部分是怎么回事:
cmp(y,x)
是用来比较两个数字的,它会返回-1
(表示 y 小于 x)、0
(表示 x 和 y 相等)或者1
(表示 y 大于 x)。lambda
是在定义一个函数,这个函数是针对每个列表的最后一个元素的?然后在排序的时候用到这个 lambda?我有点困惑——有没有人能解释一下这个 lambda 函数是干嘛的?
4 个回答
你例子中的lambda函数决定了哪个项目优先。
在一个“经典”的情况下,它会简单地计算 x-y
:如果结果是 负数
,这意味着 x比y小
,因此 x在y之前
。
另外,你可以给排序方法传一个反向参数,也就是 reverse=True
,这样就会反转排序的顺序。
在这个例子中,你的“sort”函数实际上就是“lambda包装器”中的cmp函数。在这里,你把x和y的顺序调换,并使用第三个参数,这意味着它会按照反向顺序排序(x/y交换),并通过比较所有的第三个参数(x[2]
)来实现。
关于你的第二个问题:
... 有人能解释一下lambda函数的作用吗?
如果你在问什么是lambda函数:它是一种匿名的轻量级内联函数。匿名意味着它没有名字。(但你可以给它一个名字。例如: sqr = lambda x : x**2
,这样你就可以像使用其他函数一样使用它: y = sqr(2)
)
Normal function: def name(arg): vs lambda-function: lambda arg: ret_value
^ ^ ^ ^ ^ ^ ^
a) b) c) a) b) c) d)
- a) 关键字,标记后面的内容是一个普通/ lambda函数
- b) 如果lambda函数“缺失”,则是匿名的函数名
- c) 函数参数:普通函数用括号,lambda函数则不需要
- d) 返回值 - 普通函数需要用return显式返回(如果没有返回则返回None)。而lambda函数会隐式返回冒号右侧的计算结果。
你提到的sort函数的使用是lambda函数的一个典型用例。它们被用作“临时”函数,可以直接使用,而不需要创建一个自己的普通函数。
一种更“Pythonic”的写法可能是这样的:
from operator import itemgetter
keyfunc = itemgetter(2) # takes the 3rd argument from an itterable
sorted_list = sorted(lol, key=keyfunc, reverse=True)
其实,用 sort
的 key
参数来做这个事情更好,cmp
有点过时了。
举个例子:
lol.sort(key=lambda x: x[2])
(你也可以用 x[-1] 来表示列表中的最后一个元素)
你是在创建一个 lambda 函数,并把它传递给 sort
函数。你也可以这样写:
get_third_element = lambda x: x[2]
lol.sort(key=get_third_element)
或者为了让它更容易理解:
def get_third_element(x):
return x[2]
lol.sort(key=get_third_element)
其实你完全可以把一个函数作为参数传给另一个函数!
那在排序里用lambda?我搞不懂了!
其实很简单,当sort()
需要比较两个元素时,它会调用lambda函数,然后根据这个函数的结果来决定哪个元素应该排在前面。就这么简单。