方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变
sorted(iterable[, cmp[, key[, reverse]]])
参数说明:
- iterable -- 可迭代对象。
- cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key -- 主要是用来进行比较的元素,
cmp详解,首先python3不存在cmp,使用functools.cmp_to_key(函数)代替cmp
----cmp函数的意思(用于可迭代对象)
如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素),那么可以通过compare(x,y)形式自定义比较函数。
compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:
>>> cmp(42,32)
1
>>> cmp(99,100)
-1
>>> cmp(10,10)
0
------那么python中的sorted 如何根据cmp中的 1 -1 0来排序的,为什么返回1或-1就可以判定正序或逆序呢?
cmp比较两个元素的大小,如果返回1,将第一个元素移动至后面,返回0表示相等,返回-1将第二个元素移动至后面(也就是位置不变),据cmp的返回值执行算法,将小的元素放前面,大的元素放后面
>>> def numeric_compare(x, y): ... return x - y >>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare) [1, 2, 3, 4, 5]
x-y>0,cmp(x-y>0)=1,代表吧第一个元素(x)放后面,这就是从小到大排序
>>> def reverse_numeric(x, y): ... return y - x >>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric) [5, 4, 3, 2, 1]
cmp(y-x>0)=1,就把第一个元素(x)放后面【也就是越小越在后面】,也就是从大到小排序
-----再后来python3没有了cmp参数,使用functools.cmp_to_key(函数)代替cmp
看一个复杂的例子
def cmp(e1, e2):
import numpy as np
res = np.sign(e1[1] - e2[1])
if res != 0:
return res
else:
a = e1[0] + e2[0]
b = e2[0] + e1[0]
if a > b:
return 1
elif a == b:
return 0
else:
return -1
for k,v in sorted(tfidf_dic.items(), key = functools.cmp_to_key(cmp))
我们手工定义了cmp函数(只返回-1,0,1)
首先比较字典中两个元素,各自的第二项(value),因为是第一个大于第二个返回1,functools.cmp_to_key(cmp)把第一个元素放在后面,代表从小到大排序
之后比较字典两个元素,各自的第一项(key),因为第一个ascii码大于第二个返回1,从而也是代表从小到大排序