语法后面sorting(键= lambda :)
我不太了解sorted()
参数的语法:
key=lambda variable: variable[0]
不是lambda
任意的? 为什么variable
在dict
两次?
key
是一个函数,将被调用来转换集合的项目之前进行比较。 传递给key
的参数必须是可调用的。
lambda
的使用创build一个匿名函数(可调用)。 在sorted
的情况下,可调用只需要一个参数。 Python的lambda
非常简单。 它只能做和真正返回一件事情。
lambda
的语法是lambda
这个词,然后是参数名称列表,然后是单个代码块。 参数列表和代码块由冒号描述。 这与python中的其他构造类似,比如while
, for
, if
等等。 它们都是通常有代码块的语句。 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,分为两部分。
- 使用lamba最终意味着你不必写(定义)整个函数,就像一个sblom提供的例子。 Lambda函数被创build,使用并立即被销毁 – 所以他们不会用更多的代码来替代你的代码,只会使用一次。 据我所知,这是lambda函数的核心function,其应用程序是广泛的。 它的语法纯粹是按照惯例,这本质上是程序语法的本质。 学习语法,并完成它。
lambda input_variable / s:指令
例如
lambda x:x / 2 …这意味着每个x在某些迭代中,返回x除以2。
- 关键参数背后的想法是,它接受了一组指令,实质上指向“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
- 为什么必须把一个完整的代码块放在lambda体中呢?
- 如果为空查询,则返回最大值
- 我在哪里标记一个lambdaexpression式asynchronous?
- 为什么我不能在C ++ 11中创build一个lambdas向量(相同types)?
- lambdaexpression式中的枚举编译方式不同; 重载解决scheme改进的后果?
- 从lambdaexpression式中检索属性名称
- Lambda捕获和参数具有相同的名称 – 谁影响其他? (铿锵vs gcc)
- 复制stream以避免“stream已经被操作或closures”(Java 8)
- 'await'操作符只能在asynchronouslambdaexpression式中使用