这段代码有问题,我无法理解lambda函数



我有一个关于python代码的问题。

xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}
xm = sorted(xs.items(), key = lambda x : x[1])
print(xm)

我理解sorted和items,但是lambda我不知道它是如何工作的以及为什么它工作。

我需要根据值而不是键对字典进行排序。

好,这很简单。

Sorted尝试根据某些条件对集合进行排序。

  1. 如果它是一个列表字符串,它进行a comes before baa comes before ab的字符串比较。

  2. 用于int,1 comes before 2等的列表。

在你的例子中,你传递的是一个字典。因此,Python将尝试根据它们的keys值(在本例中是一个字符串)对它们进行排序。REMEMBER, when you do dict.items(), you get a list of tuples and item at 0th index is the key

所以下面的代码将给出如下结果:

xs = {'a': 4, 'x': 3, 'z': 2, 'd': 1}
xm = sorted(xs.items())
print(xm)

-

[('a', 4), ('d', 1), ('x', 3), ('z', 2)]

你可以看到,a在d之前,d在x和z之前。

现在如果我们不想使用默认行为怎么办?代替使用key作为排序标准,我们可以使用value。为了实现这一点,我们需要告诉排序函数从元组中获取values,然后使用它们进行比较。

下面的代码做同样的事情。lambda将接收元组作为x,并返回x[1],这是字典中的值。

xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}
xm = sorted(xs.items(), key = lambda x : x[1])
print(xm)

[('d', 1), ('c', 2), ('b', 3), ('a', 4)]

这里,1在2、3和4之前。

现在,如果您将lambda更新为lambda x : x[0],您将显式地告诉排序函数使用dict键作为排序标准,这是默认行为

[('d', 1), ('c', 2), ('b', 3), ('a', 4)]

xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}
xm = sorted(xs.items(), key = lambda x : x[0])
print(xm)

[('a', 4), ('b', 3), ('c', 2), ('d', 1)] # same as before without the lambda

为什么有效?所以,您正在使用sorted函数,它接受一个函数作为第二个参数。在您的示例中,该参数用于按值排序,而不是按键排序。为什么?

xs.items()返回dict_items([('a', 4), ('b', 3), ('c', 2), ('d', 1)])一个包含元组数组的对象。当您使用sorted(xs)时,排序函数会查看数组内部并考虑元组的第一个元素,在您的情况下为'a', 'b', 'c', 'd'。因为'a'小于'b'等原因,它会按照这个值进行排序。

让我们考虑另一个例子,使用xs对默认情况下不按键排序的元素:

xs = {'b': 3, 'c': 2, 'a': 4, 'd': 1}

这个有xs.items()=

dict_items([('b', 3), ('c', 2), ('a', 4), ('d', 1)]

但是,当你使用sorted函数时,你得到:

>>> xm = sorted(xs.items())
>>> xm
[('a', 4), ('b', 3), ('c', 2), ('d', 1)]

按元组的第一个元素排序。

所以,这和write:

是一样的
xm = sorted(xs.items(), key=lambda x: x[0])

Alias =我要按数组xs.items()的第一个元素排序,也就是key

但是xs.items()也返回值作为元组的第二个元素,所以,如果你写这样的东西(与你的代码相同):

xm = sorted(xs.items(), key=lambda x: x[1])

你说:我想排序数组xs.items()的第二个元素,也称为valuexs的值为:[3, 2, 4, 1](在您的示例中为[4,3,2,1])。因此,它按照"小于"的规则对元素排序。在代码的最后,您将看到一个数组,它的第二个元素i处的元组小于元组i+1第二个元素。


如果你想要逆的,所以,排序大于,你可以使用参数reverse=True

相关内容

  • 没有找到相关文章

最新更新