Python面试题系列之07: 请简述下 sort 和 sorted 的区别?
Question
作为python的内置的排序函数,sort
和sorted
有什么区别?
知识点详解
这两个函数都是用来排序的,如下:
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')]
说完两者的区别,再看看相同之处。通过定义来看,sorted
和list.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」。