python
有两个内置的排序函数:
sort([func])
sorted(iterable[,cmp[,key[,reverse]]])
区别在于:
sort
是应用在list
上的方法,sorted
可以对所有可迭代的对象进行排序操作。
list
的sort
方法返回的是对已经存在的列表进行操作,而内建函数sorted
方法返回的是一个新的list
,而不是在原来的基础上进行的操作。
sort
很好理解,和 js
中的 sort
很类似
// python
aList = [123, 'xyz', 'zara', 'abc', 'xyz']
print aList.sort()
=> [123, 'abc', 'xyz', 'xyz', 'zara']
// js
let aList = [123, 'xyz', 'zara', 'abc', 'xyz']
console.log(aLIst.sort())
=> [123, "abc", "xyz", "xyz", "zara"]
至于sorted
,最多有四个参数,一个必选,三个可选,大概含义如下:
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
其中, iterable
和 reverse
这两个参数很好理解,但是 cmp
和 key
,如果是各自单独存在,也很好理解,例如:
L=[('a', 4), ('b', 3), ('c', 1), ('d', 2)]
// 使用 cmp 根据每个列表项中元祖的第二项进行升序排序
print sorted(L, cmp=lambda x, y: cmp(x[1], y[1]))
==>[('c', 1), ('d', 2), ('b', 3), ('a', 4)]
// 使用 key 根据每个列表项中元祖的第一项进行升序排序
print sorted(L, key=lambda x: x[0])
==> [('a', 4), ('b', 3), ('c', 1), ('d', 2)]
如果是 cmp
和 key
同时指定,那么可能就稍微需要想一下了
如果同时指定
cmp
和key
,那么cmp
函数两个参数值,要根据key
指定的项来获取。
例如:
print sorted(L, cmp=lambda x, y: cmp(x, y), key:lambda x: x[0])
==> [('a', 4), ('b', 3), ('c', 1), ('d', 2)]
首先,先通过 key
指定了 通过 x[0]
,即元祖的第一项值对L
进行升序排序,接着因为 cmp
的存在,所以相当于是通过 key
从 L
中获取了一个新列表 L1 = ['a', 'b', 'c', 'd']
,然后再使用 cmp
对此新列表 L1
进行排序,其实也就相当于 sorted(L, key=lambda x: x[0])
,所以二者的结果都是一样的。