python基础——排序函数

值得注意的是,列表和数组的排序方式不一样

列表排序函数: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]就可以逆序输出,倒过来结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值