Python面试题系列之07 sort 和 sorted 的区别

Python面试题系列之07: 请简述下 sort 和 sorted 的区别?

Question

作为python的内置的排序函数,sortsorted有什么区别?

知识点详解

这两个函数都是用来排序的,如下:

L = [5, 2, 3, 1, 4]
L.sort()
print(L)
>>> [1, 2, 3, 4, 5]

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

既然都能实现排序,作为内置的排序函数,为什么还需要两个呢?毕竟它们俩长得也很像的啊,究竟有什么区别呢?🤔🤔

我们通过下面这组例子观察研究一下。

List_A = ['p','y','t','h','o','n','i','s','t','a']
List_A_new = List_A.sort()
print(List_A)
>>> ['a', 'h', 'i', 'n', 'o', 'p', 's', 't', 't', 'y']
print(List_A_new)
>>> None

List_B = ['p','y','t','h','o','n','i','s','t','a']
List_B_new = sorted(List_B)
print(List_B)
>>> ['p', 'y', 't', 'h', 'o', 'n', 'i', 's', 't', 'a']
print(List_B_new)
>>> ['a', 'h', 'i', 'n', 'o', 'p', 's', 't', 't', 'y']

有木有感到很奇怪:使用sort函数排序后,List_A的值变成了排序后的结果,但是List_A_new的值却是None。对于使用sorted函数进行排序后,List_B的值并没有发生变化,而List_B_new的值才是排序后的列表。

要解决这个疑问,我们就需要从源头说起,先看看sort函数

>>> help(list.sort)
Help on method_descriptor:

sort(self, /, *, key=None, reverse=False)
    Stable sort *IN PLACE*.

原来sort()方法是在原来的列表上直接进行排序,并没有返回一个新的列表,所以返回值为None!

再来看看sorted函数

>>> 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函数比sort函数,多了一个参数iterable,这说明它可以为任意可迭代的对象进行排序。而sort函数只是列表中的方法,只能用于列表中的排序。

以下是使用sorted()对字符串,元组,字典进行排序。

S = 'pythonista'
print(sorted(S))
>>> ['a', 'h', 'i', 'n', 'o', 'p', 's', 't', 't', 'y']

T = (3, 6, 1, 5, 4, 2)
print(sorted(T))
>>> [1, 2, 3, 4, 5, 6]

D = {'1': 'a', '2': 'b', '0': 'c'}
sorted(D.items())
>>> [('1', 'a'), ('2', 'b'), ('3', 'c')]

说完两者的区别,再看看相同之处。通过定义来看,sortedlist.sort都是可以接受key,reverse定制的。

  • 根据参数key排序
    用列表元素的某个属性或函数作为关键字
L = [('b',2),('a',1),('c',3),('d',4)]
print(sorted(L, key=lambda x:x[1]))
>>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

L = [('b',2),('a',1),('c',3),('d',4)]
L.sort(key=lambda x:x[1])
print(L)
>>> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
  • 根据参数reverse排序
    reverse=False为升序;reverse=True为降序
L = [1,2,5,3,9,4,6,8,7,0]
L.sort(reverse=False)
print(L)
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

L = [1,2,5,3,9,4,6,8,7,0]
L.sort(reverse=True)
print(L)
>>> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

L = [1,2,5,3,9,4,6,8,7,0]
print(sorted(L,reverse=False))
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(sorted(L,reverse=True))
>>> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Answer

sort()函数

  • 无返回值,在原位重新排列列表,未创建新的列表;
  • 只适用于列表排序。

sorted()函数

  • 有返回值,产生一个新的列表,不改变原列表;
  • 适用于任意可以迭代的对象排序。

后记

需要注意的是,因为sorted()函数会产生返回值,在数据量较大的场景中,这会浪费较大的存储空间。所以,在列表进行排序时,需要考虑是否需要保存原列表,若无需保存原列表,则优先使用sort()函数,以节省内存空间,提高效率。好了,以上就是本篇全部内容。

备注:本篇首发于知识星球「人人都是Pythonista」。


文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录