python中的 sort 和 sorted

python有两个内置的排序函数:

sort([func])
sorted(iterable[,cmp[,key[,reverse]]])

区别在于:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
listsort 方法返回的是对已经存在的列表进行操作,而内建函数 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 升序(默认)。

其中, iterablereverse这两个参数很好理解,但是 cmpkey,如果是各自单独存在,也很好理解,例如:

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)]

如果是 cmpkey同时指定,那么可能就稍微需要想一下了

如果同时指定cmpkey,那么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的存在,所以相当于是通过 keyL中获取了一个新列表 L1 = ['a', 'b', 'c', 'd'],然后再使用 cmp对此新列表 L1进行排序,其实也就相当于 sorted(L, key=lambda x: x[0]),所以二者的结果都是一样的。

你可能感兴趣的:(python)