python——sort()详解

sort()

原地排序,也就是使用后并不是返回一个有序的序列副本,而是把当前序列变得有序。

sort() 是列表类的方法,只能对列表排序。sorted()对列表排序时,有返回值;sorted()对列表排序时,无法返回值(直接在原列表中操作)。


a = [1,3,5,2]
a.sort() #执行后无法返回
a #[1,2,3,5]

sorted()

sorted是python的内置函数,可以对列表(list),元祖(tuple),字典(dict)和字符串(str)进行排序。

a=[1,3,2]
b=sorted(a)
print(a) #[1,3,2]
print(b) #[1,2,3]

比较

相同点

  • sort 和 sorted 都有两个可选仅限关键字参数 key 和 reverse,都是默认升序排序。
  • 数字、字符串按照ASCII,中文按照unicode从小到大排序。

不同点

  • sort 是列表的一个方法,它的第一个参数是 self,即列表实例对象本身;
    sorted 是内置函数,它的第一个参数是 iterable,即可迭代对象。
    所以 sorted 不止可以作用于列表,还可以作用于元组、字典等可迭代对象。
  • sort 方法是对列表原地排序,返回值是 None;
    sorted 函数是返回一个新的列表,不改变原可迭代对象。
  • sort 方法不能级联调用,sorted 函数可以级联调用。

参数

key

sort 方法和 sorted 函数还可以接收一个可选仅限关键字参数 key,key 是一个只有一个参数的函数,这个函数会依次作用于序列的每一个元素,并将所得的结果作为排序的依据。key 默认是 None,即恒等函数(identity function),也就是默认用元素自己的值排序。

示例

先转化小写再排序——

a = ['This', 'is', 'a', 'test', 'string', 'from', 'Andrew']
b=sorted(a)
print(b) #['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
c=sorted(a, key=str.lower)
print(c) #['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

这里的 key=str.lower 就是把 a 中的每个元素都用 str.lower 方法处理,即:都转为小写,然后再进行比较排序。

多维数组按某一列排序——

a = [(3,2,1),(1,3,2),(2,1,3)]
b=sorted(a, key=lambda p:p[2])
print(b) #[(3, 2, 1), (1, 3, 2), (2, 1, 3)]
c=sorted(a, key=lambda p:p[1])
print(c) #[(2, 1, 3), (3, 2, 1), (1, 3, 2)]

对于复杂的数据对象,我们可以用对象的索引,取对象的一部分作为比较的 key,这时匿名函数(lambda)会帮助我们。

取对象的属性作为比较的 key——

class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

    def __repr__(self):
        return repr((self.name, self.grade, self.age))

student = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
sorted(student, key=lambda s: s.age)   # 按年龄进行排序
#[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

底层原理

sorted 和 list.sort 背后的排序算法都是 Timsort 算法,它是一种自适应算法,会根据原始数据的特点交替使用归并排序(merge sort)和插入排序(insertion sort)。在实际应用场景中这是非常有效的一种稳定排序算法。

posted @ 2022-09-15 18:58  岸南  阅读(1069)  评论(0)    收藏  举报