值得注意的是,列表和数组的排序方式不一样
列表排序函数:sort()和sorted()
sort() 是Python内置的一个排序函数,它会从一个迭代器返回一个排好序的新列表,相比sort(),sorted()使用的范围更为广泛,如果不需要保留列表,sort更为有效,sort()只适用于列表
一句话就是:两个函数都适用列表,sort()不保留原列表且只用于列表,sorted()接受一切可迭代序列,包括列表和数组,但返回是新的列表,sorted使用更广
两个方法有以下2个共同的参数:
key是带一个参数的函数,返回一个值用来排序,默认为None。此函数在每个元素比较前被调用
reverse表示排序结果是否逆转
注意: a.sort() 已改变其结构,b = a.sort() 是错误的写法!
sorted()函数使用方法:
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>>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)]
>>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)]
>>> sorted(student_tuples, key = lambda student: student[0])
# 对姓名排序 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key = lambda student: student[2])
# 年龄排序 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]
# 如果我们想用第二个关键字排过序后再用第一个关键字进行排序呢?
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> print sorted(L, key=lambda x:(x[1],x[0]))
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
注:效率key>cmp(key比cmp快)
另外可以调用operator模块中的itemgetter()实现根据多个参数进行排序
from operator import itemgetter
>>> sorted(student_tuples, key = itemgetter(2))
# 根据年龄排序 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_tuples, key = itemgetter(1, 2))
# 根据成绩和年龄排序 [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> sorted(student_tuples, key = itemgetter(1, 2), reverse=True)
# 反转排序结果 [('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]
数组的排序函数 argsort()
argsort()函数返回的按排列顺序输出要排列数组的下标,即第一个数表示在待排序中最大或最小的那个下标
# 一维
a = ['1.5','5.3','4.4','4.2','23.1']
x = np.array(a)
print(x.argsort()[::-1]) #降序
print(x.argsort()) #升序
print(np.argsort(x)) #升序
[1 2 3 4 0]
[0 4 3 2 1]
[0 4 3 2 1]
对一维数组,argsort()返回的是数组从小到大的索引值,也就是说,对于第一个输出里[1 2 3 4 0] 这个1表示在a里下标为1的最大(降序的话)0表示在a里下标为0的最小。
同时,要注意的是a里面的是字符串的比较,所以造成了5.3 比 23.1 大,因为它从左往右,第一个数来的大就大
这个坑要牢记,踩过就别踩了
# 二维
content = []
for i in a:
content.append(i.split('.'))
print(content)
c = np.array(content)
print(c.argsort(axis=0)) #按列排序升序
print(c.argsort(axis=0)[::-1]) #按列排序降序
print(c.argsort(axis=1)) #按行排序升序
[['1', '5'], ['5', '3'], ['4', '4'], ['4', '2'], ['23', '1']]
[[0 4]
[4 3]
[2 1]
[3 2]
[1 0]]
[[1 0]
[3 2]
[2 1]
[4 3]
[0 4]]
[[0 1]
[1 0]
[0 1]
[1 0]
[1 0]]
对二维数组来说,按列,在一列上进行排序,返回的第一列就是第一列从小到大排好的下标,返回的第二列就是第二列从小到大排好的下标。
1 5 4 4 23
0 1 2 3 4
从小到大:0 4 2 3 1 (此时是字符的比较)
可以看到当遇到相同时的排位是由当前的数组顺序决定的。['4','4'] ['4','2'] 按列排,前者在前面
数组后加一个[::-1]就可以逆序输出,倒过来结果