2016-09-30 60 views
2

我正在阅读Python的教程介绍,我一直在理解一段代码。这是来自教程的第4.7.5节。Python初学者 - 使用lambda函数对元组进行排序

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

的码,该位因此,在一个行返回

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

,它定义了与不同元组的列表对。我明白了。 第二行是我完全抛弃的地方,我已经做了相当多的修改,试图了解发生了什么。

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

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

Lambda在冒号左侧定义了一个新参数“pair”,右侧是定义lambda函数返回值的计算。

这就是我被扔掉的地方。 “pair [1]”是做什么的?它对结肠左侧“对”的影响是什么?

它返回什么值?除了像这样编码之外,我似乎无法让它返回任何价值。

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

任何人都可以解释这对我吗?谢谢。

+0

用'lambda'你可以引用你需要排序的值。 –

+0

如果你第一次做'key = lambda pair:pair [1]',然后调用'key(pairs [0])',并将它与'key(pairs [1])'进行比较会有帮助吗?如果我告诉你,最终结果按字母顺序排列在每个元组的第二个元素上? –

回答

0

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

+0

非常感谢。我一直盯着这几个小时。我认为它指向了“对”变量中的位置(一旦我的思想陷入困境,就没有回来了,而不是元组的位置,现在变得更有意义了,谢谢! –

0

A lambda是一个简化函数,仅使用一个表达式。

任何拉姆达可以写成一个函数,由表达式之前加入在return,所以lambda pair: pair[1]变为:

def lambda_function(pair): return pair[1] 

所以在list.sort()呼叫这里拉姆达返回每个序列的元件(Python索引从0开始)。

您可以将此可见通过分配拉姆达给一个变量,也就是说,key

>>> 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 transform

1

有时候开始使用lambda时,明确写出该函数会更容易。你的lambda函数等同于:根据返回值

def sort_key(pair): 
    int_value, string_value = pair 
    return string_value 

因为list.sort订单项目:

def sort_key(pair): 
    return pair[1] 

如果我们想更详细的,我们可以解开对使它更加明显key函数(如果存在),现在我们看到它正在对它们的字符串值进行排序。由于字符串按字典顺序排序,所以"four"出现在"one"之前(认为按字母排序)。