Python学习笔记——Sort与Sorted

Sort()和Sorted()的区别

先举例两者用法:

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

上例可以看出,sort是list的属性方法,得用L.sort()来调用,无需额外参数,无返回值,而且运行完之后L本身发生了变化(但内存地址没有变化);而sorted并非是list的属性,就是一个普通的方法,需要传入待排序的可迭代对象作为参数,重新生成并返回排序后的对象,原对象则保持不变。
额外注意:之所以区分这两个函数,只是单纯因为它们长得像,功能有点像(都可以实现),但它俩根本不是一个层面上的东西。像“sort()不可以对dict对象进行排序”这种陈述压根不用记,因为sort()是人家list自己的方法。
python2.x中的sort()接收cmp,key和reverse三个参数,但cmp这个参数有点鸡肋,因为如果升序排列,这个参数可以不要,如果倒序排列,reverse可以实现,如果需要更复杂的比较方式,key可以接收lambda函数来实现,所以python3中已经砍掉这个参数。

Sort()

按照python3中的sort()来讲,两个参数讲解如下:

>>> L = [[41,23],[15,90],[60,50]]
>>> L.sort()
>>> L
[[15, 90], [41, 23], [60, 50]] #1
>>> L.sort(reverse=True)
>>> L
[[60, 50], [41, 23], [15, 90]] #2
>>> L.sort(key = lambda x: x[0])
>>> L
[[15, 90], [41, 23], [60, 50]] #3
>>> L.sort(key = lambda x: x[1])
>>> L
[[41, 23], [60, 50], [15, 90]] #4
>>> L = ['Ben','Adam','Zelda']
>>> L.sort()
>>> L
['Adam', 'Ben', 'Zelda'] #5
>>> L.sort(key = lambda x: x[2])
>>> L
['Adam', 'Zelda', 'Ben'] #6
>>> L = [[93,95],[45,34],[54,3]]
>>> L.sort()
>>> L
[[45, 34], [54, 3], [93, 95]] #7
>>> L = [[[93,95],[12,44]],[[45,34],[44,90]],[[54,3],[66,12]]]
>>> L.sort()
>>> L
[[[45, 34], [44, 90]], [[54, 3], [66, 12]], [[93, 95], [12, 44]]] #8

1和2对比:reverse默认False,即升序排列,指定为True后,就降序排列。
3和4对比:可以用key参数来比对特定的字符。
5和6对比:对于字符串,默认比较首字符的ASCII码的大小。
7和8对比:如果有多层嵌套的list,默认比较最小单元的第一个元素。即,如果有两层就默认比较x[0][0],如果有3层,就默认比较x[0][0][0]。
也许你会想,如果一个list中既有数字也有字符串,那应该也会按照首字符的ASCII码来比较吧。错了!

>>> L = [95,'A',40]
>>> L.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

A对应的ASCII码是65,但结果却返回错误:小于号不可以用在比较字符串和整型上。究其原因,是因为默认的cmp参数会依次从待比较的list中取出两个要比较的元素,做减法逐个比较大小。而字符和数字之间不可以直接加减。那就把数字也转换成string类型吧。

>>> L = ['95','A','40']
>>> L.sort()
>>> L
['40', '95', 'A']

奇怪了!A是65,怎么会比95还大呢?
原因在于,这几个元素都是字符串,那就都按字符的ASCII码来比较。40的4对应的ASCII是52,95的9对应的ASCII是57,再加上A是65,这顺序也就没错了。

附: ASCII对照表

Sorted()

sorted()与sort()的参数都一样,这里只说不一样的地方。由于sorted()可以对任何的可迭代对象进行排序,对dict排序的时候,默认是对key进行排序的,如果需要对value排序就传key来实现。

>>> s = {1:5,2:3}
>>> sorted(s)
[1, 2]
>>> sorted(s,key = lambda x: s[x])
[2, 1]

因为dict作为一个整体是无序集合,是无法排序的,所以也就不难理解为什么排序后返回的只有包含key的list。

>>> array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
>>> array = sorted(array,key = lambda x: x['age'])
>>> array
[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
>>> array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
>>> array.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'

猜你喜欢

转载自blog.csdn.net/leavemetomorrow/article/details/88719561