• Python 的列表排序


    在 Python 中, 当需要对一个 list 排序时, 一般可以用 list.sort() 或者 sorted(iterable[, cmp[, key[, reverse]]]).
    其中:
    cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数.
    key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.
    reverse 是一个布尔值, 表示是否反转比较结果.

     我以前在做比较复杂的排序时, 喜欢写一个定制的 cmp 函数. 当我看了 Python 文档后, 发现我的做法是不好的. 简单说明如下:

    1, 通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次.  
    也就是说, 同等情况下, 写 key 函数比写 cmp 函数要高效很多.  
      
    2, 对一些貌似比较复杂的排序, 也是不需要写 cmp 函数的, 举例如下:  
    >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]  
      
    用元素索引做 key:  
    >>> sorted(students, key=lambda student: student[2])   # sort by age  
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]  
      
    用元素已经命名的属性做 key:  
    >>> sorted(students, key=lambda student: student.age)   # sort by age  
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]  
      
    用 operator 函数来加快速度, 上面两个排序等价于:  
    >>> from operator import itemgetter, attrgetter  
    >>> sorted(students, key=itemgetter(2))  
    >>> sorted(students, key=attrgetter('age'))  
      
    用 operator 函数进行多级排序, 这个就是比较复杂的应用. 按我以前的理解, 是一定要写个定制的 cmp 函数的. 现在看来, 以前真的够笨.  
    # sort by grade then by age  
    >>> sorted(students, key=itemgetter(1,2))  
    [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]  
    >>> sorted(students, key=attrgetter('grade', 'age'))  
    [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]  
      
    3, 根据字典值排序  
    >>> d = {'a':2, 'b':23, 'c':5, 'd':17, 'e':1}  
      
    #1, 返回 pair 对:  
    from operator import itemgetter  
    >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)  
    [('b', 23), ('d', 17), ('c', 5), ('a', 2), ('e', 1)]  
      
    #2, 仅返回 keys:  
    >>> sorted(d, key=d.__getitem__, reverse=True)  
    ['b', 'd', 'c', 'a', 'e']  
      
    4, sorted() 会返回一个新的已经排好序的 list.  
    list.sort() 是就地排序, 以节约空间, 当然就不会返回一个排好序的新的 list 了. 这对大的 list 排序是有空间优势的.  
  • 相关阅读:
    centos8 安装vmware需要的内核头文件 kernel-headers.
    centos7开启ssh服务
    systemctl命令的使用及服务状态的查看
    centos WPS 字体安装
    CentOS8 使用 aliyun 阿里云 镜像站点的方法
    CentOS提示::unknown filesystem type 'ntfs'自动挂载NTFS分区的U盘或者移动硬盘
    Aria2 Centos8 安装配置
    centos7 更新Firefox版本
    线程内容详解
    进程池、进程池和多进程的性能测试、进程池的其他机制、进程池的回调函数
  • 原文地址:https://www.cnblogs.com/xupeizhi/p/3035862.html
Copyright © 2020-2023  润新知