语法后面sorting(键= lambda :)

我不太了解sorted()参数的语法:

 key=lambda variable: variable[0] 

不是lambda任意的? 为什么variabledict两次?

key是一个函数,将被调用来转换集合的项目之前进行比较。 传递给key的参数必须是可调用的。

lambda的使用创build一个匿名函数(可调用)。 在sorted的情况下,可调用只需要一个参数。 Python的lambda非常简单。 它只能做和真正返回一件事情。

lambda的语法是lambda这个词,然后是参数名称列表,然后是单个代码块。 参数列表和代码块由冒号描述。 这与python中的其他构造类似,比如whileforif等等。 它们都是通常有代码块的语句。 Lambda只是代码块语句的另一个实例。

我们可以比较lambda和def的使用来创build一个函数。

 adder_lambda = lambda parameter1,parameter2: parameter1+parameter2 def adder_regular(parameter1, parameter2): return parameter1+parameter2 

lambda只是给了我们一个这样做的方式,而不分配一个名字。 这使得它非常适合用作函数的参数。

variable在这里被使用了两次,因为在冒号的左边是参数的名字,而在右边它被用在代码块中来计算一些东西。

我认为这里的所有答案都涵盖了lambda函数在sorted()的上下文中所做的核心,但是我仍然觉得像一个描述导致了一个直观的理解是缺乏的,所以这里是我的两分钱。

为了完整起见,我将陈述明显的前面:sorted()返回一个有序元素列表,如果我们想要以特定的方式sorting,或者如果我们想sorting一个复杂的元素列表(例如嵌套列表或元组列表),我们可以调用关键参数。

对于我来说,关键参数的直观理解,为什么它必须可调用,以及使用lambda作为(匿名)可调用函数来完成这个function,分为两部分。

  1. 使用lamba最终意味着你不必写(定义)整个函数,就像一个sblom提供的例子。 Lambda函数被创build,使用并立即被销毁 – 所以他们不会用更多的代码来替代你的代码,只会使用一次。 据我所知,这是lambda函数的核心function,其应用程序是广泛的。 它的语法纯粹是按照惯例,这本质上是程序语法的本质。 学习语法,并完成它。

lambda input_variable / s:指令

例如

lambda x:x / 2 …这意味着每个x在某些迭代中,返回x除以2。

  1. 关键参数背后的想法是,它接受了一组指令,实质上指向“sorting()”列表元素,它应该用来sorting。 当它说'key ='时,它的真正含义是:当我一次遍历列表中的一个元素(即列表中的e)时,我将把当前元素传递给我提供的函数参数,并使用它来创build一个转换列表,它将通知我最终sorting列表的顺序。

一探究竟:

 mylist = [3,6,3,2,4,8,23] sorted(mylist, key=WhatToSortBy) 

基例:

 sorted(mylist) 

[2,3,4,6,8,23]#所有数字从小到大依次排列。

例1:

 mylist = [3,6,3,2,4,8,23] sorted(mylist, key=lambda x: x%2==0) 

[3,3,23,6,2,4,8]#这个sorting结果是否对你有直观的意义?

请注意,我的lambda函数被告知sorting以检查(e)在sorting之前是否是偶数或奇数。

可是等等! 你可能(也许应该)想知道两件事 – 首先,为什么我的可能性在我的平均值之前出现(因为我的关键值似乎告诉我的sorting函数通过在x%2 == 0中使用mod运算符来优先考虑平均值)第二,为什么我的房子失灵? 2来之前6对吗? 通过分析这个结果,我们将更深入地了解sorting()'键'参数的工作方式,特别是与匿名lambda函数结合使用。

首先,你会注意到,虽然赔率出现在平均水平之前,但平衡本身并没有被sorting。 为什么是这样?? 让我们阅读文档 :

关键函数从Python 2.4开始,list.sort()和sorted()都添加了一个关键参数,用于指定在进行比较之前在每个列表元素上调用的函数。

我们必须在这些行之间做一些阅读,但是这告诉我们的是sort函数只被调用一次,如果我们指定了key参数,那么我们就按照key函数指向的值进行sorting。

什么使用模数返回的例子? 布尔值:True = 1,False = 0。 那么如何sorting处理这个关键? 它将原始列表bascially转换为1和0的序列。

[3,6,3,2,4,8,23]变成[0,1,0,1,1,1,0]

现在我们正在某处。 当你对转换后的列表进行sorting时,你会得到什么?

[0,0,0,1,1,1,1]

好吧,现在我们知道为什么赔率出现在平仓之前。 但接下来的问题是:为什么在我的最终名单中,6还是在2之前呢? 那很容易 – 因为sorting只发生一次! 最后一个问题是:我如何从概念上思考如何在打印出最终的sorting列表时将布尔值的顺序转换回原始值?

Sorted()是一个内置的方法,(有趣的事实)使用了一个名为Timsort的混合sortingalgorithm,它结合了合并sorting和插入sorting的各个方面。 在我看来很清楚,当你调用它时,有一个机制将这些值保存在内存中,并将它们与由(…!)lambda函数确定的布尔标识(掩码)捆绑在一起。 这个顺序是由它们的lambda函数计算出来的布尔型标识决定的,但是请记住,这些(1和0)的子列表本身并不是按它们的原始值sorting的。 因此,由Odds和Evens组织的最终名单并不是按子列表sorting的(在这种情况下,这些排名无序)。 赔率是有序的这一事实是因为它们在原始列表中已经按巧合sorting了。 从这一切中得出的结论是,当lambda进行这种转换时,保留了子列表的原始顺序。

那么这又如何与原来的问题联系起来呢?更重要的是,我们是否应该用关键参数和lambda来实现sorted()的直觉呢?

这个lambda函数可以被认为是一个指向我们需要sorting的值的指针,无论它是一个将值映射到它的由lambda函数转换的布尔值的指针,还是它在嵌套列表,元组,字典等再次由lambda函数确定。

让我们尝试并预测当我运行下面的代码时会发生什么。

 mylist = [(3, 5, 8), (6, 2, 8), ( 2, 9, 4), (6, 8, 5)] sorted(mylist, key=lambda x: x[1]) 

我sorting的方法显然是说,“请sorting这个列表”。 关键参数使得对mylist中的每个元素(x)返回该元素的索引1 ,然后按照由列表的sorting顺序对原始列表“mylist”的所有元素进行sortinglambda函数。 由于我们有一个元组列表,我们可以从这个元组中返回一个索引元素。 所以我们得到:

[(6,2,8),(3,5,8),(6,8,5),(2,9,4)]

运行该代码,你会发现这是命令。 尝试索引一个整数列表,你会发现代码中断。

这是一个漫长的解释,但我希望这有助于“sorting”你使用lambda函数的直觉,作为sort()和其他关键参数。

lambda是用于生成匿名函数的Python关键字。

 >>> (lambda x: x+2)(3) 5 

:的左边的variable是一个参数名称。 右侧的variable使用参数。

意思几乎完全一样:

 def some_method(variable): return variable[0] 

lambda是一个匿名函数,不是一个任意的函数。 被接受的参数将是您正在使用的variables,以及您在其中进行sorting的列。

由于lambda的使用是在sorted()的上下文中提出的,所以请看这个https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions