4

假设我定义了一个列表列表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

4 回答 4

4

那么 lambda 里面的排序呢?我搞不清楚了!

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

于 2013-03-13T21:34:48.973 回答
4

这实际上最好使用 to 的key参数来完成sortcmp有点过时了。

例如:

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)

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

于 2013-03-13T21:38:05.893 回答
3

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

在“经典”情况下,它会简单地计算x-y:如果结果是negative,则意味着x is smallery 和因此来before y

此外,您可以将反向参数传递给排序方法,这将reverse=True是顺序。

在这种情况下,您的“排序”功能是“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) 返回值——在普通函数被省略的情况下,因为必须显式地用 return 返回。(没有显式返回它提供无) lambda 隐式返回冒号右侧的评估结果。

您使用排序函数的示例是 lambda 函数的典型用例。它们被用作“丢弃”函数,您可以内联而不创建自己的正常函数。

一个更“pythonic”的变体是这样的:

from operator import itemgetter

keyfunc = itemgetter(2) # takes the 3rd argument from an itterable
sorted_list = sorted(lol, key=keyfunc, reverse=True)
于 2013-03-13T21:52:08.250 回答
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])

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

于 2013-03-13T21:40:13.980 回答