python中key=lambda_排序后的语法(key=lambda:…)

看看吧:mylist = [3,6,3,2,4,8,23]

sorted(mylist, key=WhatToSortBy)

基本示例:sorted(mylist)[2, 3, 3, 4, 6, 8, 23] # all numbers are in order from small to large.

例1:mylist = [3,6,3,2,4,8,23]

sorted(mylist, key=lambda x: x%2==0)[3, 3, 23, 6, 2, 4, 8] # Does this sorted result make intuitive sense to you?

注意,lambda函数告诉sorted在排序之前检查(e)是偶数还是奇数。

但是等等!您可能(或者应该)想知道两件事-首先,为什么我的概率会早于evens(因为我的键值似乎告诉我的排序函数通过使用x%2==0中的mod运算符来确定evens的优先级)。第二,为什么我的睡眠不正常?2比6先到对吧?通过分析这个结果,我们将进一步了解sorted()“key”参数是如何工作的,特别是与匿名lambda函数结合使用时。

首先,你会注意到,虽然赔率在晚上之前,但晚上本身并没有被排序。这是为什么??Lets read the docs:Key Functions Starting with Python 2.4, both list.sort() and sorted() added a key parameter to specify a function to be called on

each list element prior to making comparisons.

我们需要在这两行之间进行一些读取,但这告诉我们,sort函数只调用一次,如果我们指定了key参数,那么我们将根据key函数指向的值进行排序。

那么这个使用模的例子会返回什么呢?布尔值:True == 1,False == 0。那么sorted如何处理这个密钥呢?它基本上将原始列表转换为1和0的序列[3,6,3,2,4,8,23] becomes [0,1,0,1,1,1,0]

现在我们有进展了。当你对转换后的列表进行排序时会得到什么?[0,0,0,1,1,1,1]

好吧,现在我们知道为什么赔率在晚上之前。但下一个问题是:为什么在我的最终名单中,6个仍然排在2个之前?好吧,这很简单,因为分类只发生一次!i、 e.这些1仍然代表原始列表值,它们相对彼此处于原始位置。由于排序只发生一次,并且我们不调用任何排序函数来将原始偶数值从低到高排序,因此这些值相对彼此保持其原始顺序。

最后一个问题是:当我打印出最终的排序列表时,如何从概念上考虑如何将布尔值的顺序转换回原始值?

已排序()是一个内置的方法,它(有趣的事实)使用一个名为Timsort的混合排序算法,该算法结合了合并排序和插入排序的各个方面。我很清楚,当你调用它时,有一个机制将这些值保存在内存中,并将它们与由(…!)确定的布尔标识(mask)捆绑在一起lambda函数。顺序是由从lambda函数计算出的布尔恒等式决定的,但请记住,这些子列表(1和0的子列表)本身并不是按其原始值排序的。因此,虽然最终的列表是按赔率和偶数排列的,但并不是按子列表排序的(本例中的偶数是无序的)。赔率排序的事实是,它们在原始列表中已经是巧合地按顺序排列的。所有这些的好处是,当lambda进行转换时,子列表的原始顺序将被保留。

那么这一切又是如何与最初的问题联系起来的呢?更重要的是,我们的直觉告诉我们应该如何用sorted()的键参数和lambda来实现它?

lambda函数可以看作是指向需要排序的值的指针,无论它是将值映射到lambda函数转换的布尔值的指针,还是它在嵌套列表、元组、dict等中的特定元素,都再次由lambda函数确定。

让我们试着预测当我运行下面的代码时会发生什么。mylist = [(3, 5, 8), (6, 2, 8), ( 2, 9, 4), (6, 8, 5)]

sorted(mylist, key=lambda x: x[1])

我的sorted电话显然是在说,“请对这个列表进行排序”。关键参数使这一点更加具体,它说,对于mylist中的每个元素(x),返回该元素的索引1,然后根据lambda函数计算的列表排序顺序对原始列表“mylist”中的所有元素排序。因为我们有一个元组列表,所以可以从该元组返回一个索引元素。所以我们得到:[(6, 2, 8), (3, 5, 8), (6, 8, 5), (2, 9, 4)]

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

这是一个冗长的解释,但我希望这有助于“排序”您对使用lambda函数作为sorted()和beyond中的关键参数的直觉。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值