列表方法.sort()和函数sorted()排序

.sort()

sort是列表的一种方法,只能和列表一起使用。sort返回None并就地修改列表(覆盖原列表)。

L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

  • sort对列表元素的排序默认按照升序进行,通过可选关键字参数reverse设置为True可将元素按照降序排列。
  • 同时可向sort的可选关键字key传递一个函数,这个函数有如下特点:
    • 仅接受一个参数,在此处,此参数即列表中的一个元素;
    • 此函数必须能够处理列表中的所有元素;
    • 函数返回的值是可用于排序的值。

传递给key的函数可以是提前定义的,也可以使用lambda定义:

def add(x):
    return x + 10


values_to_add = [1, 2, 3]
values_to_add.sort(key=add)

或者

values_to_add = [1, 2, 3]
values_to_add.sorted(key=lambda x: x+10)

对于一些复杂的列表,比如一个多种建筑工具的名称和重量组成的列表:

power_tools = [
    ['drill', 4],
    ['circular saw', 5],
    ['jackhammer', 40],
    ['sander', 4],
    ]

可以按照名称字母进行排序:
power_tools.sort(key=lambda x: x[0])
或者按照工具重量进行排序:
power_tools.sort(key=lambda x: x[1])

但如果要求先按照重量再按照名称字母进行排序,有以下两种实现方法:

  1. 第一种是利用元组进行比较
    元组间的比较是按照位置进行的,第一元组的第一项与第二元组的第一项相比较;如果它们不相等(即第一项大于或小于第二组),则这是比较的结果,否则考虑第二项,然后再考虑第三项等等。

所以满足上述要求的比较方法如下:
power_tools.sort(key=lambda x: (x[1], x[0]))
得到的结果如下:
[['drill', 4], ['sander', 4], ['circular saw', 5], ['jackhammer', 40]]

这是一种比较简单且可读性比较好的方法,但是缺点是两个元素只能按照相同的方向进行排序(都为升序或降序)。虽然对于数据的比较可以通过加上一个负号-来逆转这一元素的排序方向,如:power_tools.sort(key=lambda x: (-x[1], x[0]))但是对于非数据类型原则则不管用,如下述代码会报错:power_tools.sort(key=lambda x: (x[1], -x[0]))。这个时候需要用到下面的方法。

  1. 利用.sort()方法对同一列表进行多次排序
    通过向关键字key传递一个函数对列表元素进行处理后,如果返回的值对于某些元素是相等的,那么这些元素将保留其输入时的相对位置,所以可以利用这一特点,对同一列表进行多次排序。如可以通过下述方法达到和power_tools.sort(key=lambda x: (-x[1], x[0]))同样的效果:
power_tools.sort(key=lambda x: x[0])  # Name ascending
power_tools.sort(key=lambda x: x[1], reverse=True)  # Weight descending

需要注意的是,如果要先按照重量降序排列,再按照名称字母升序排列,那么应该先执行按照名称字母升序排列的代码,在执行按照重量降序排列的代码,即代码与最终顺序是相反的。

sorted()

.sort()作为列表的方法不同,sorted()是Python的内置函数,可以对输入的列表、字典、元组、字符串等进行排序,并返回一个以列表为容器的返回值:

help(sorted)
Help on built-in function sorted in module builtins:

sorted(iterable, /, *, key=None, reverse=False)
    Return a new list containing all items from the iterable in ascending order.

    A custom key function can be supplied to customize the sort order, and the
    reverse flag can be set to request the result in descending order.

当输入是列表时,sorted()函数将返回一个排序后的新列表,并不改变原列表;sorted(dict)时,是按键排序,同时将键返回成一个列表。

同样的,可向sorted()函数的关键字key传递一个函数,用于对排序的元素进行处理并返回一个用于排序的值来指定排序条件。这个函数的特点和向列表.sort()方法的关键字key传递的函数一样。