鱼C论坛

 找回密码
 立即注册
查看: 2279|回复: 11

[已解决]关于列表排序sort中的函数用法

[复制链接]
发表于 2021-9-20 21:27:09 | 显示全部楼层 |阅读模式
3鱼币
请版主大人不要在帖子未超过规定时间就替我设置最佳答案,谢谢合作!!!!!
list=[ ["1","c++","demo"],  
       ["1","c","test"],  
       ["2","java",""],  
       ["8","golang","google"],  
       ["4","python","gil"],  
       ["5","swift","apple"]  
]  
list.sort(key=lambda ele:ele[0])# 根据第1个元素排序  
print(list)  
list.sort(key=lambda ele:ele[1]) #先根据第2个元素排序  
print(list)  
list.sort(key=lambda ele:ele[1]+ele[0]) #先根据第2个元素排序,再根据第1个元素排序  
print(list)
如题,不是很懂这个sort中的函数用法,我怎么完全不懂这三个函数的运行机理呢?
哪位大哥可以帮忙解释一下这个函数的运行机制吗


最佳答案
2021-9-20 21:27:10
本帖最后由 白two 于 2021-9-20 22:33 编辑

sort 虽然是已经封装好的方法,但你得明白,既然要比较,那一定会传参进去,所以 sort 应该是默认把每一个元素作为参数传进去
所以每一个 lambda函数都设有一个 ele 去接收这个参数,返回值就是后面的表达式
一般比较的是一个列表里面的单个元素,所以直接比较参数就行,但是你这比较的是列表里面的列表,所以会把内层列表作为参数传进去,获取指定元素作为返回值,再根据该返回值进行比较
结合下面代码容易理解:
# 获取列表的第二个元素
def takeSecond(elem):
    return elem[1]
 
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
 
# 指定第二个元素排序
random.sort(key=takeSecond)
你这只是用的匿名函数而已,逻辑是一样的

下面是 sort 的源代码,但只有一段说明,底层估计是 c 写的,看不到
    def sort(self, *args, **kwargs): # real signature unknown
        """
        Sort the list in ascending order and return None.
        
        The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
        order of two equal elements is maintained).
        
        If a key function is given, apply it once to each list item and sort them,
        ascending or descending, according to their function values.
        
        The reverse flag can be set to sort in descending order.
        """
        pass
你要是用兴趣可以去搜一下 sort 方法的原理,估计能更快领悟

最佳答案

查看完整内容

sort 虽然是已经封装好的方法,但你得明白,既然要比较,那一定会传参进去,所以 sort 应该是默认把每一个元素作为参数传进去 所以每一个 lambda函数都设有一个 ele 去接收这个参数,返回值就是后面的表达式 一般比较的是一个列表里面的单个元素,所以直接比较参数就行,但是你这比较的是列表里面的列表,所以会把内层列表作为参数传进去,获取指定元素作为返回值,再根据该返回值进行比较 结合下面代码容易理解: 你这只是 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 21:27:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 白two 于 2021-9-20 22:33 编辑

sort 虽然是已经封装好的方法,但你得明白,既然要比较,那一定会传参进去,所以 sort 应该是默认把每一个元素作为参数传进去
所以每一个 lambda函数都设有一个 ele 去接收这个参数,返回值就是后面的表达式
一般比较的是一个列表里面的单个元素,所以直接比较参数就行,但是你这比较的是列表里面的列表,所以会把内层列表作为参数传进去,获取指定元素作为返回值,再根据该返回值进行比较
结合下面代码容易理解:
# 获取列表的第二个元素
def takeSecond(elem):
    return elem[1]
 
# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
 
# 指定第二个元素排序
random.sort(key=takeSecond)
你这只是用的匿名函数而已,逻辑是一样的

下面是 sort 的源代码,但只有一段说明,底层估计是 c 写的,看不到
    def sort(self, *args, **kwargs): # real signature unknown
        """
        Sort the list in ascending order and return None.
        
        The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
        order of two equal elements is maintained).
        
        If a key function is given, apply it once to each list item and sort them,
        ascending or descending, according to their function values.
        
        The reverse flag can be set to sort in descending order.
        """
        pass
你要是用兴趣可以去搜一下 sort 方法的原理,估计能更快领悟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 21:39:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 21:53:47 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-9-20 21:55 编辑

你的注释,已经比较清楚地解释了呀,比如 根据第一个元素排序,就是 根据 "1", "1", "2", ... 它们进行排。

至于lambda匿名函数,说白了就是 输入什么,输出什么。这里就是逐个输入列表的元素,输出该元素(又是一个列表)的第一个元素,即 根据 "1", "1", "2", ... 来排。

第三个则稍微要转一下,因为都是字符串,所以 ele[1]+ele[0] 也是字符串,组合成一个字符串(如"c++1","c1", "java2",...),
就是 逐个字符比较,可以认为是 先根据第二个元素排,再根据第一个元素排,但这不是很准确的说法。



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 22:50:28 | 显示全部楼层


开幕雷击,一般我们不会在七天内设置最佳,除非问题明显已成功解决

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 22:56:05 | 显示全部楼层

如题,不是很懂这个sort中的函数用法,我怎么完全不懂这三个函数的运行机理呢?


sort  的 key 参数接受一个 function ,即 函数,可以将此函数返回值进行依次排序

而从你代码上看,列表中元素全是字符串,所以就相当于是给字符串进行比较大小

而字符串比较大小是从左到右依次比较 ASCII 值,直到分出大小结束,后续字符不在进行比较,其实这三个运行机制你只要理解上面红字的话,应该可以大致理解

另外 lambda 匿名函数,基础语法:    lambda <传入参数>:<返回值> ; 实际上都是比较 将list 中 列表 传入后 返回的 索引后的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:18:47 | 显示全部楼层
suchocolate 发表于 2021-9-20 21:39
https://www.runoob.com/python3/python3-att-list-sort.html

哥,我看的就是这个帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:23:21 | 显示全部楼层
阿奇_o 发表于 2021-9-20 21:53
你的注释,已经比较清楚地解释了呀,比如 根据第一个元素排序,就是 根据 "1", "1", "2", ... 它们进行 ...

哥,恕我愚笨,我实在还是没看懂,能不能将匿名函数改写成为def 这样的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:25:59 | 显示全部楼层
阿奇_o 发表于 2021-9-20 21:53
你的注释,已经比较清楚地解释了呀,比如 根据第一个元素排序,就是 根据 "1", "1", "2", ... 它们进行 ...

好了 我看懂四楼了不用了 ,嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:27:45 | 显示全部楼层
Twilight6 发表于 2021-9-20 22:50
开幕雷击,一般我们不会在七天内设置最佳,除非问题明显已成功解决

呜呜呜,我的上一个帖子就是这样的,而且我艾特那个人了【冬雪学冬】也不理我https://fishc.com.cn/thread-202475-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:29:29 | 显示全部楼层
白two 发表于 2021-9-20 22:29
sort 虽然是已经封装好的方法,但你得明白,既然要比较,那一定会传参进去,所以 sort 应该是默认把每一个 ...

感谢你把这个匿名写成了正常的def,我看懂了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-21 17:31:06 | 显示全部楼层
Twilight6 发表于 2021-9-20 22:56
sort  的 key 参数接受一个 function ,即 函数,可以将此函数返回值进行依次排序

而从你代码上看 ...

【白two】的答案更加清楚的把这个匿名写成了正常的def,我瞬间看明白了,她的答案更加具体点好理解。
不过结合你的答案我看的更明白了,谢谢解答!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表