难以理解排序中的lambda函数

4 投票
4 回答
6924 浏览
提问于 2025-04-17 19:00

假设我定义了一个列表的列表,叫做 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 个回答

3

你例子中的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)
4

其实,用 sortkey 参数来做这个事情更好,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)

其实你完全可以把一个函数作为参数传给另一个函数!

4

那在排序里用lambda?我搞不懂了!

其实很简单,当sort()需要比较两个元素时,它会调用lambda函数,然后根据这个函数的结果来决定哪个元素应该排在前面。就这么简单。

撰写回答