• 详解Python列表(list)的方法sort()的第一个参数key【简单清晰明了的讲解】


    Python列表(list)的方法sort()的语法如下:

    list.sort( key=None, reverse=False)
    
    • 1

    两个参数都是可选的,第二个参数不用讲了,很简单,就是控制是按升序还是降序排。

    这篇文章主要讲第一个参数key的作用。

    那么参数key的作用是什么呢?
    总的来说,我们可以利用它实现按我们想要的标准进行排序,即我们可以自定义排序的标准,或者称为自定义排序的方式。

    参数key是某个函数的返回值,这个函数的输入参数只有一个,那就是我们要待排序的列表的每一个元素(相当于待排序列表中有多少个元素就执行多少次这个函数),这个函数的返回值作为我们对列表元素进行排序的依据。
    上面这句话不太好理解,没头系,看几个实例就知道。

    先看对嵌套列表(二维列表)的默认排序。

    list1 = [[1, 7], [1, 5], [2, 4], [1, 1]]
    list1.sort()
    
    • 1
    • 2

    运行结果如下:
    在这里插入图片描述
    从运行结果我们可以看出,默认的排序方式是先按每个列表型元素的第0个元素进行排序,再按每个列表型元素的第1个元素进行排序的。

    如果我们想让排序方式按每一个列表型元素的第1个元素进行排序,怎么办呢?
    按下面这样写就行了。

    def sort_fun(x1):
        return x1[1]
    
    
    list1 = [[1, 7], [1, 5], [2, 4], [1, 1]]
    list1.sort(key=sort_fun)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果如下:
    在这里插入图片描述
    我们看到,上面的结果正是按每一个列表型元素的第1个元素进行排序的。
    怎么实现的呢?
    sort()方法在执行后,会将list1中四个列表型元素[1, 7]、[1, 5]、 [2, 4]、[1, 1]依次作为函数sort_fun的输入参数,并依次得到四个返回值,四个返回值为各自索引为1的元素值,即7、5、4、1这四个值,这四个值按升序排序后为1、4、5、7,所以四个列表型元素[1, 7]、[1, 5]、 [2, 4]、[1, 1]就被排序为了[1, 1]、[2, 4]、[1, 5]、 [1, 7]。
    我们可以利用匿名函数lambda来简化上面的写法。
    关于匿名函数lambda的介绍可以参见下面这篇文章:
    https://zhuanlan.zhihu.com/p/58579207

    利用匿名函数lambda来简化上面的代码:

    list1 = [[1, 7], [1, 5], [2, 4], [1, 1]]
    list1.sort(key=lambda x1: x1[1])
    
    • 1
    • 2

    运行结果和上面的运行结果一样:
    在这里插入图片描述

    再举一个例子,我们要对列表中的字符串按长度进行排序,那么可以像下面这样写:

    list1 = ['baidu', 'CSDN', 'QQ', 'Google', 'suwenhao']
    list1.sort(key=lambda x1: len(x1))
    
    • 1
    • 2

    运行结果如下:
    在这里插入图片描述
    怎么样实现的呢?
    sort()方法在执行后,会将五个字符串元素’baidu’, ‘CSDN’, ‘QQ’, ‘Google’, 'suwenhao’分别代入匿名函数中作为输入参数,并依次求得它们的长度为5、4、2、6、8,按长度升序排的话就是2、4、5、6、8,这样原序列就被排序为了:[‘QQ’, ‘CSDN’, ‘baidu’, ‘Google’, ‘suwenhao’]

    从上面的示例我们可以看出,方法sort()的第一个参数key调用的函数输入参数只有一个,即只能为待排序的列表的每一个元素,如果我们想有更多的参数实现更强的排序功能,怎么办呢?可以参考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/125407158

  • 相关阅读:
    MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL
    windows搭建elasticsearch和elasticsearch-head/kibana
    CANAPE中加载DBC后,如何在脚本中获取到DBC内的信号量
    sshpass
    /dev下没有video0这个文件(ubuntu无法打开摄像头)
    ヾ(⌐ ■_■)— HTML-动画和布局
    springboot项目若以集成minio文件服务
    Vue关键知识点
    秒杀系统设计
    [晕事]今天做了件晕事24;GCC -W
  • 原文地址:https://blog.csdn.net/wenhao_ir/article/details/125406092