我正在阅读Python的教程介绍,并且我不得不理解一段代码。这是本教程的第4.7.5节。
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函数的返回值的计算。
那是我被甩掉的地方。什么"配对[1]"做?它对"对#34;的影响是什么?在结肠的左侧?
它返回什么价值?我似乎不能让它在编码之外返回任何类型的价值。
我猜测它以某种方式指向一个特定的元组并根据重新定位对其进行排序,但我不确定其背后的逻辑。
有人可以帮我解释一下吗?谢谢。
答案 0 :(得分:1)
有时在开始使用lambda
时,显式地写出函数会更容易。你的lambda函数相当于:
def sort_key(pair):
return pair[1]
如果我们想要更详细,我们可以解包配对,使其更加明显:
def sort_key(pair):
int_value, string_value = pair
return string_value
因为list.sort
根据key
函数的返回值(如果存在)对项目进行排序,现在我们看到它按照字符串值对元组进行排序 。由于字符串按字典顺序排序,"four"
出现在"one"
之前(按字母顺序排列)。
答案 1 :(得分:0)
你的lambda函数将一个元组作为输入并返回索引为1的元素(所以第二个元素是因为第一个元素的索引为0)。
所以排序只会考虑每个元组的第二个元素(英文单词)。这就是您的输出在第二个元素'four'>'one'>'three'>'two'
答案 2 :(得分:0)
lambda
是一个简化函数,仅使用表达式。
任何lambda都可以作为函数编写,方法是在表达式之前添加return
,因此lambda pair: pair[1]
变为:
def lambda_function(pair): return pair[1]
因此list.sort()
调用中的lambda返回传入的每个序列的 second 元素(Python索引从0
开始)。
您可以通过将lambda分配给变量来表明这一点,例如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之后,这种通过替代密钥排序的形式通常称为Schwartzian transform,他在Perl中推广该技术。