zoukankan      html  css  js  c++  java
  • Python的列表排序

    Python的列表排序

    本文为转载,源地址为:http://blog.csdn.net/horin153/article/details/7076321

      在 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 排序是有空间优势的.

  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/LeeZz/p/3864938.html
Copyright © 2011-2022 走看看