假设我定义了一个列表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函数的用途吗?
答案 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)
使用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])
的值
所以这种方式会以这种方式对列表进行排序:每当它遇到两个元素时,它将获取“三元组”中的最后一个值并比较它们以确定优先级。