关于Python初学者:Python初学者-使用Lambda函数对元组进行排序

Python beginner - Sorting tuples using lambda functions

我正在阅读有关Python的教程简介,并且坚持理解一段代码。这是来自本教程的4.7.5节。

1
2
3
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
pairs

这部分代码返回

1
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

因此,在第一行中,它定义了具有不同元组列表的对。我明白了。
第二行是我完全被抛弃的地方,为了弄清楚正在发生的事情,我做了很多的弄乱工作。

我发现sort()正在将内置函数应用于变量对,并且大概是按照我给出的指令对其进行排序。

sort()函数需要一个键,而键必须使用一个函数来定义,因此要使用lambda。我认为所有这些都是正确的,但我可能离这里很远。

Lambda在冒号的左侧定义了一个新参数" pair",而在右侧则是用于定义lambda函数的返回值的计算。

那就是我被抛弃的地方。" pair [1]"是做什么的?它对结肠左侧的"对"有什么影响?

它返回什么值?我似乎无法让它像这样编码之外返回任何类型的值。

我猜测它以某种方式指向一个特定的元组,并根据重新定位对其进行排序,但是我不确定其背后的逻辑。

谁能为我解释一下?谢谢。


有时,当开始使用lambda时,显式地写出函数会更容易。您的lambda函数等效于:

1
2
def sort_key(pair):
    return pair[1]

如果我们想更详细些,我们可以解开配对以使其更加明显:

1
2
3
def sort_key(pair):
    int_value, string_value = pair
    return string_value

因为list.sort根据key函数的返回值(如果存在)对项目进行排序,所以现在我们看到它正在按元组的字符串值对它们进行排序。由于字符串按字典顺序排序,因此"four""one"之前(请考虑字母顺序)。


lambda是仅使用表达式的简化函数。

通过在表达式之前添加return,可以将任何lambda编写为函数,因此lambda pair: pair[1]变为:

1
def lambda_function(pair): return pair[1]

因此,此处list.sort()调用中的lambda返回传入的每个序列的第二个元素(Python索引从0开始)。

您可以通过将lambda分配给变量key来使其可见:

1
2
3
4
5
6
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> key = lambda pair: pair[1]
>>> key(pairs[0])
'one'
>>> key(pairs[1])
'two'

list.sort()方法使用这些调用的输出(对于列表中的每个元素一次)对元素进行排序。因此,对于这4个元素,该函数返回'one''two''three''four',然后将这4个元组完全按照这4个字符串的字典顺序(字母顺序)排序。该顺序为'four''one''three''two',这是您在最终排序列表中看到的内容。

在Randal L. Schwartz(在Perl中普及该技术)之后,这种按其他键排序的形式通常称为Schwartzian变换。


您的lambda函数将一个元组作为输入,并返回索引为1的元素(因此,第二个元素的索引号为0)。
因此排序只会考虑每个元组的第二个元素(英文单词)。这就是为什么您的输出在第二个元素'four'>'one'>'three'>'two'中按字母顺序排序的原因