博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

Python 列表 sort()函数使用理解

Posted on 2025-04-03 11:05  二灯大师  阅读(548)  评论(0)    收藏  举报

前言

sort()函数是Python内置的一种排序方法,它直接作用在列表上,对列表中的元素进行原地排序,即不生成新的列表,而是在原列表上进行修改。

sort()函数与sorted()函数之间的区别。虽然两者都用于排序,但sorted()函数会返回一个新的已排序列表,而不修改原始列表。这使得sorted()函数在需要保留原始列表顺序的场合下特别有用。

语法

list.sort( key, reverse ),不写参数,默认升序排列,写reverse=Ture降序排列,key传入排序规则函数,比如列表第几个元素等


参数

  1.  
    key :#(可选)指定排序规则
  2.  
    reverse :#(可选)升序降序


返回值

返回None,同时将原列表排序。也就是没有返回值
案例:将列表中的元素排序

  1.  
    1.list1 = [1, 3, 2, 5]
  2.  
    2.list1.sort()
  3.  
    3.print(list1)

输出:

[1, 2, 3, 5]

1、升序降序


reverse 参数控制排序的「升序」和「降序」,True表示降序、False表示升序;默认升序reverse=False

  1.  
    1.list1 = [1, 3, 2, 5]
  2.  
    2.list1.sort(reverse=True)
  3.  
    3.print(list1)
  4.  
    4.list1.sort(reverse=False)
  5.  
    5.print(list1)
  6.  
    6.list1.sort()
  7.  
    7.print(list1)

输出:

  1.  
    [5, 3, 2, 1]
  2.  
    [1, 2, 3, 5]
  3.  
    [1, 2, 3, 5]

2、sort()和sorted()的区别(修改原列表和不修改原列表)


接收 sort() 的返回值,可以发现是None

输出:

  1.  
    1.list1 = [1, 3, 2, 5]
  2.  
    2.list2 = list1.sort()
  3.  
    3.print(list2

输出:

None

打印一下排序前、后的「内存地址」,可以发现地址没有改变

  1.  
    list1 = [1, 3, 2, 5]
  2.  
    print(id(list1))
  3.  
    list1.sort()
  4.  
    print(id(list1))

输出:

  1.  
    2361470487744
  2.  
    2361470487744

sort() 的设计思想就是「修改」原列表,而不是返回新的列表;
它不会创建新的列表,从而节省「效率」;
当然,这也意味着原列表被修改了,使用时要留意这一点;
sorted() 是 sort() 的扩展函数,可以对列表的元素排序,同时不会修改原列表。

  1.  
    list1 = [1, 3, 2, 5]
  2.  
    list2 = sorted(list1)
  3.  
    print(list1)
  4.  
    print(list2)

输出:

  1.  
    [1, 3, 2, 5]
  2.  
    [1, 2, 3, 5]

从结果可以看到, sorted() 创建了新的列表,用来保存排序后的列表。

3、切片排序(切片不可变对象可复制,可变对象切片后仍会影响原列表)


将原列表「切片」复制给新列表,再对新列表排序,同样可以实现排序且不改变原列表。

  1.  
    list1 = [1, 3, 2, 5]
  2.  
    list2 = list1[:]
  3.  
    list2.sort()
  4.  
    print(list1)
  5.  
    print(list2)

输出:

  1.  
    [1, 3, 2, 5]
  2.  
    [1, 2, 3, 5]

直接「赋值」的方式是不行的,因为赋值的话,两个列表会指向同一个内存地址,原列表会同步变化。

  1.  
    list1 = [1, 3, 2, 5]
  2.  
    list2 = list1
  3.  
    list2.sort()
  4.  
    print(list1)
  5.  
    print(list2)

输出:

  1.  
    [1, 2, 3, 5]
  2.  
    [1, 2, 3, 5]

4、指定排序规则


key 参数可以指定排序「规则」

4.1、按字符串长度排序


对于元素全是字符串的「列表」,可以按照字符串的「长度」来排序

  1.  
    list1 = ['aaaaa', 'aa', 'aaaa', 'a']
  2.  
    list1.sort(key=len)
  3.  
    print(list1)

输出:

['a', 'aa', 'aaaa', 'aaaaa']

本质上是利用字符串的 len() 函数计算长度,再排序,如果遇到 int 这列没有 len() 函数的元素,是会报错 TypeError: object of type ‘int’ has no len()。

4.2、按第二个字符排序


对于元素全是字符串的列表,可以按照元素的第几个「字符」排序。

  1.  
    list1 = ['cb', 'fa', 'zd', 'ec']
  2.  
    list1.sort(key=lambda x: x[1])
  3.  
    print(list1)

输出:

['fa', 'cb', 'ec', 'zd']


需要注意的是,所有元素的字符长度都要够数,比如元素只有1个字符,却按照第2个字符排序,函数找不到第2个字符,肯定会报错 IndexError: string index out of range

4.3、查找第n大的元素


先降序,再按照「索引」取值,就能获取列表中第一大的值或第二大的值等。

  1.  
    list1 = [4, 3, 9, 6, 1]
  2.  
    list1.sort(reverse=True)
  3.  
    print('最大的元素:', list1[0])
  4.  
    print('第二大的元素:', list1[1])

输出:

  1.  
    最大的元素: 9
  2.  
    第二大的元素: 6

5、其他类型排序


sort() 只能对列表排序,而 sorted() 能对可迭代对象排序;所以,字符串、元组、字典等类型想排序,可以用 sorted()

  1.  
    str1 = "312"
  2.  
    print(sorted(str1))
  3.  
     
  4.  
    tuple1 = (5, 1, 3)
  5.  
    print(sorted(tuple1))
  6.  
     
  7.  
    dict1 = {"key1": 1, "key2": 2}
  8.  
    print(sorted(dict1))

输出:

  1.  
    ['1', '2', '3']
  2.  
    [1, 3, 5]
  3.  
    ['key1', 'key2']

从输出结果可以发现,字符串、元组、字典类型排序后,返回的是列表类型;并且字典只对键排序,不对值排序。