去冰无糖 发表于 2022-1-25 12:28:56

关于sorted()函数中key参数搭配lambda函数的用法请教

本小白刚学Python,想通过刷题来锻炼自己。
刷题计划的第一题:
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。
然后看到一个参考答案:
sorted(nums, key=lambda x: )
于是有了以下请教:
1.关于lanmbda的写法。我自己测试时lambda x: 与lambda x: (nums.count(x), -x)均能运行([]替换为了()),请问这两种写法是否有区别?只是刚好在这句代码中作用一致?
2.关于sorted()中key参数搭配lambda函数的用法。按我自己的理解,key=lambda x: 这句代码的含义是先按照第一个条件nums.count(x),每个列表元素的次数大小进行升序排序,再按照第二个条件-x,在满足条件一的前提下降序排序。请问这种理解是否准确,我想得到最准确的代码释义。
3.请问一下两种写法在功能上是否有区别。sorted(nums,reverse=True)与sorted(nums,key=lambda x:-x)
4.请问是否可以运用sorted()函数中的key参数,搭配lambda函数实现多条件排序?比如key=lambda x: [条件一,条件二,条件三……]
5.关于cmp参数的用法。我查阅资料显示,sorted(iterable, cmp=None, key=None, reverse=False),其中关于cmp的参数说明是 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。(一般省略)我根本看不懂,请问能够给出一个关于cmp参数用法的实例吗?

恳请大佬细心指教!第一次发帖若有违规的地方或者表达不清晰的地方请见谅!

Twilight6 发表于 2022-1-25 13:03:24


1.关于lanmbda的写法。我自己测试时lambda x: 与lambda x: (nums.count(x), -x)均能运行([]替换为了()),请问这两种写法是否有区别?只是刚好在这句代码中作用一致?

运行效果上没区别,只是一个是列表,一个是元组,且它们都是先从最开始的元素进行比较排序,若先比较的元素未分出大小才继续比较下一个元素

2.关于sorted()中key参数搭配lambda函数的用法。按我自己的理解,key=lambda x: 这句代码的含义是先按照第一个条件nums.count(x),每个列表元素的次数大小进行升序排序,再按照第二个条件-x,在满足条件一的前提下降序排序。请问这种理解是否准确,我想得到最准确的代码释义。

就是按照在序列中先后来确定优先级的,比如若是 则就是先相互比较 x1 ,若有相同,则才开始比较 x2,依此类推

3.请问一下两种写法在功能上是否有区别。sorted(nums,reverse=True)与sorted(nums,key=lambda x:-x)

功能上当然有区别,举个简单的例子: 前者可以排序 字符串,后者只能排序数值型

速度上也可能有区别,因为前者是开发者写好的,算法上可能比我们自己写 key 后执行效率高

4.请问是否可以运用sorted()函数中的key参数,搭配lambda函数实现多条件排序?比如key=lambda x: [条件一,条件二,条件三……]

看问题2,本质上你这题就是多条件排序,先比较 count 的次数,后比较元素相反值

5.关于cmp参数的用法。我查阅资料显示,sorted(iterable, cmp=None, key=None, reverse=False),其中关于cmp的参数说明是 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。(一般省略)我根本看不懂,请问能够给出一个关于cmp参数用法的实例吗?

这个不太清楚,刚刚百度了下好像 Python3 已经把sorted 的 cmp 参数移除了

参考文章:https://blog.csdn.net/robin912/article/details/45054713?

python爱好者. 发表于 2022-1-25 13:03:30

1.这两种写法有区别,因为这里 lambda 表达式的语法如下:
lambda 参数 : 返回值
所以如果按您那种写法,最后返回的类型一个是列表,一个是元组。

2.这里您的代码是:
key=lambda x:
这里面的 key 参数是用来改变 sorted 方法排序算法的设置,如:
sorted(,key = lambda x:-x)
这里将 key 参数设置成了 lambda x:-x ,而这里的 x 就是每个从列表取出来后获得的元素,最后返回它们相反的值,再与之比较。
所以结果就变成了这样:

而不是:

这里注意,它虽然是将它们每个元素反过来作比较,但最后输出结果并不会改变成前面设置的相反的值。

3.没有区别,这里都是将 nums 从大到小进行排序。

4。不可以。

5.这里并没有必要去了解这个参数,因为这在小甲鱼的速查手册 https://fishc.com.cn/forum.php?mod=viewthread&tid=191022&extra=page%3D1%26filter%3Dtypeid%26typeid%3D768
里也没有被提及,所以应该是没有或不重要。


懂了吗?不懂可以再问!懂了就给个好评呗!!!
{:10_257:}{:10_297:}{:10_281:}{:10_298:}
打字不易!请给个好评!!!
兄弟!给个好评!求求了!!!
{:10_254:}{:10_254:}{:10_254:}{:10_254:}

大马强 发表于 2022-1-25 13:30:43

最近再看cookbook,经常遇到key参数,在vs看sorted源码看不懂{:10_266:},我说说我的看法
1、一个是返回列表一个是返回元组,元组和列表比较的规则和字符串比较像,只要某对应下标的元素不一样就不会比下去了
>>> ("a",2,999999999) < ("b",)
True
但是整型和字符是不可以比较的
2、比如一个简单的列表 ,按照这个表达式 lambda x: 我们得到这些序列
(2, -2); (1,-4); (1,-1); (1.-5);(2,-2); (2.-3);(2,-3) ,按照1的规则,那这五个序列从小到大是(1,-5) < (1,-4) < (1,-1) < (2,-3) = (2,-3)< (2,-2) = (2,-2)
为了测试猜想是否正确,运行 sorted(nums, key=lambda x: )看下结果
>>> a =
>>> sorted(a,key=lambda x: )

sorted返回的结果比不是一个个元组,但是结果和我的猜想的顺序差不多,那我猜在sorted中会建一个这样的数据结构
假设传入序列是 a. 那个数据结构为(a,key参数返回值)【0<i<len(a)】,就拿前边所说(2,(2,-2)) ,但key不为空时,就用key参数做比较
3、我感觉应该是不一样的
4、参考1,2,多参数比较是可以的
5、我再想想{:10_266:}

去冰无糖 发表于 2022-1-25 13:34:38

Twilight6 发表于 2022-1-25 13:03
运行效果上没区别,只是一个是列表,一个是元组,且它们都是先从最开始的元素进行比较排序,若先比较 ...

运行效果上没区别,只是一个是列表,一个是元组,且它们都是先从最开始的元素进行比较排序,若先比较的元素未分出大小才继续比较下一个元素
非常感谢回答,说的很清楚,另外对于您所说的,未区分出大小才继续比较下一个元素,那么是否意味着,如果第一个条件就已经全部区分出了大小,后续的条件根本就不会执行?如果是这样,这种多条件的排序也是有缺陷的是吗?或者说在key参数设定多条件的时候,要考虑到这种特性,避免逻辑错误。

去冰无糖 发表于 2022-1-25 13:46:53

大马强 发表于 2022-1-25 13:30
最近再看cookbook,经常遇到key参数,在vs看sorted源码看不懂,我说说我的看法
1、一个是返回列 ...

2、比如一个简单的列表 ,按照这个表达式 lambda x: 我们得到这些序列
(2, -2); (1,-4); (1,-1); (1.-5);(2,-2); (2.-3);(2,-3) ,按照1的规则,那这五个序列从小到大是(1,-5) < (1,-4) < (1,-1) < (2,-3) = (2,-3)< (2,-2) = (2,-2)
为了测试猜想是否正确,运行 sorted(nums, key=lambda x: )看下结果

这块说的更加清楚了,感谢!
页: [1]
查看完整版本: 关于sorted()函数中key参数搭配lambda函数的用法请教