12.13 列表排序

    列表是一种有顺序(ordered)的集合 。这说明列表中的元素有某种顺序,每个元素都有一个位置,也就是它的索引。一旦以某种顺序将元素放在列表中,它们就会保持这种顺序,除非用 insert()append()remove()pop() 改变列表。不过这个顺序可能不是你真正想要的顺序。你可能希望列表在使用前已经排序。

    要对列表排序,可以使用 sort() 方法。

    >>> letters = ['d', 'a', 'e', 'c', 'b']
    >>> print letters
    ['d', 'a', 'e', 'c', 'b']
    >>> letters.sort()
    >>> print letters
    ['a', 'b', 'c', 'd', 'e']

    sort() 会自动按字母顺序对字符串从小到大排序,如果是数字,就会按数字顺序从小到大排序。 有一点很重要,你要知道 sort() 会在原地修改列表。这说明它会改变你提供的原始列表,而不是创建一个新的有序列表。所以,你不能这样做:
    >>> print letters.sort()

    如果这样做,会得到“None”。必须分两步来完成,就像这样:
    >>> letters.sort()
    >>> print letters

    按逆序排序 让一个列表按逆序排序有两种方法。一种方法是先按正常方式对列表排序,然后对这个有序列表完成逆置(reverse),如下:
    >>> letters = ['d', 'a', 'e', 'c', 'b']
    >>> letters.sort()
    >>> print letters
    ['a', 'b', 'c', 'd', 'e']
    >>> letters.reverse()
    >>> print letters
    ['e', 'd', 'c', 'b', 'a']

    在这里我们看到一个新的列表方法 reverse(),它会把列表中元素的顺序倒过来。 另一种方法是向 sort() 增加了一个参数,直接让它按降序排序(从大到小):
    >>> letters = ['d', 'a', 'e', 'c', 'b']
    >>> letters.sort (reverse = True)
    >>> print letters
    ['e', 'd', 'c', 'b', 'a']

    这个参数名为 reverse,它会按照你的意愿,将列表按逆序排序。 要记住,我们刚才讨论的所有排序和逆置都会对原来的列表做出修改。这说明,你原来的列表已经没有了。如果希望保留原来的顺序,而对列表的副本进行排序,可以使用分片记法建立副本,也就是与原列表相等的另一个列表(有关的内容已经在这一章前面讨论过):
    >>> original_list = ['Tom', 'James', 'Sarah', 'Fred']
    >>> new_list = original_list[:]
    >>> new_list.sort()
    >>> print original_list
    ['Tom', 'James', 'Sarah', 'Fred']
    >>> print new_list
    ['Fred', 'James', 'Sarah', 'Tom']

    空标题文档 - 图1 卡特,很高兴你问这个问题。如果你还记得很早很早以前我们刚开始谈到名字和变量时(第 2 章 ),曾经说过,完成 name1 = name2 之类的操作时,就是为同一个东西建立一个新的名字。应该还记得这个图: 空标题文档 - 图2 所以为一个东西指定另一个名字时,只是向同一个东西增加一个新的标签。在卡特的这个例子中,new_listoriginal_list 都表示同一个列表。可以用任何一个名字来改变列表(例如,可以对它排序)。不过,这里仍然只有一个列表,就如: 空标题文档 - 图3 我们对 new 完成排序,但是 original 也同样得到排序,因为 neworiginal 只是同一个列表的两个不同名字。这里并没有两个不同的列表。 当然,也可以把 new 标签移到一个全新的列表上,就像这样: 空标题文档 - 图4 第 2 章对字符串和数就是这样做的。 这说明,如果你确实想建立一个列表的副本,就要另想办法,而不能只是用 new = original。要达到这个目的,最容易的方法是使用分片记法,就像前面所做的:new = original[:]。这表示“复制列表中的所有内容,从第一个元素到最后一个元素”。这样就可以得到: 空标题文档 - 图5 这里有两个不同的列表。我们建立了原列表的副本,命名为 new。现在如果对一个列表排序,另一个列表将不会同时排序。 另一种排序方法——sorted()

    还有一种方法可以得到一个列表的有序副本而不会影响原列表的顺序。Python 提供了一个名为 sorted() 的函数可以完成这个功能。它的工作如下:

    >>> original = [5, 2, 3, 1, 4]
    >>> newer = sorted(original)
    >>> print original
    [5, 2, 3, 1, 4]
    >>> print newer
    [1, 2, 3, 4, 5]

    sorted() 函数提供了原列表的一个有序副本。