难以理解lambda函数的排序

时间:2013-03-13 21:32:23

标签: python list 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 个答案:

答案 0 :(得分:4)

  

然后lambda在一个排序?我迷路了!

基本上,当sort()需要比较两个元素时,它会调用lambda函数并使用其结果来确定两个元素中的哪一个应该首先出现。这就是它的全部内容。

答案 1 :(得分:3)

使用key的{​​{1}}参数实际上做得更好,sort有些过时。

例如:

cmp

(您也可以使用x [-1]表示列表的最后一个元素)

您正在创建lambda并将其传递到lol.sort(key=lambda x: x[2]) 函数中。你也可以这样写:

sort

或者让它更容易理解:

get_third_element = lambda x: x[2]
lol.sort(key=get_third_element)

没有理由不能将函数作为参数传递给另一个函数!

答案 2 :(得分:2)

示例中的lambda函数确定首先出现的项目。

在“经典”情境中,它只会计算x-y:如果结果是negative,则表示x is smaller然后是y,因此before y

另外,您可以将反向参数传递给sort-method,这将reverse=True订单。

你的“sort”函数在这种情况下是“lambda-wrapper”中的cmp函数。其中你将x的顺序与y交换并使用第三个参数,这意味着它以相反的顺序排序(x / y-swap)并通过比较所有第三个参数(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)返回值 - 在省略正常功能的情况下,因为 必须明确返回并返回。 (没有明确的回报 发送无)lambda隐式返回结果 评估结肠右侧。

使用sort-function的示例是lambda函数的典型用例。它们被用作“丢弃”函数,您可以在不创建自己的正常函数的情况下内联。

更“pythonic”的变体将是这样的:

from operator import itemgetter

keyfunc = itemgetter(2) # takes the 3rd argument from an itterable
sorted_list = sorted(lol, key=keyfunc, reverse=True)

答案 3 :(得分:1)

lambda是“函数”类型 所以你的

lambda x, y : cmp(y[2], x[2])

等于

def f(x, y):
    return cmp(y[2], x[2])

sort接受一个函数,当需要比较两个元素时,它将调用lambda函数,该函数将返回cmp(y[2], x[2])的值

所以这种方式会以这种方式对列表进行排序:每当它遇到两个元素时,它将获取“三元组”中的最后一个值并比较它们以确定优先级。