python中sort、sorted、argsort函数

1.pyhon中sort()方法,用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数

sort()方法的语法为:

list.sort(cmp=None,key=None,reverse=False)

cmp--可选参数,如果制定了改参数会使用改参数的方法进行排序

key--主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序

reverse--排序规则,reverse=True为降序,reverse=False为升序(默认)

关于返回值,该方法没有返回值,但是会对列表的对象进行排序

ls=list([5, 2, 3, 1, 4])
ls.sort()
print(ls)
>>[1, 2, 3, 4, 5]
new_ls=ls.sort()
print(new_ls)
>>None

对原列表进行排序,所以ls经过排序后,print(ls)为[1,2,3,4,5]。由于没有返回值,采用new_ls=ls.sort()打印出来的则是None

演示一个通过指定列表中元素排序输出列表:

"获取列表第二个元素"
def takeSecond(elem):
    return elem[1]
random=[(2, 2), (3, 4), (4, 1), (1, 3)]
"指定排序"
random.sort(key=takeSecond)
"输出类别"
print("list:",random)

sorted()方法与sort()有所区别,sort仅仅定义在list中,而sorted()方法对所有的可迭代的序列都有效

sorted()方法语法为:

sorted(iterable,cmp,key,reverse)
print(sorted({'D':8,'B':2,'B':3,'E':4,'A':5,}))
>> ['A', 'B', 'D', 'E']

python3中尽量使用key而避免使用cmp参数:

list1= [('david', 90), ('mary',90), ('sara',80),('lily',95)]
print(sorted(list1,cmp=lambda x,y:cmp(x[0],y[0])))

结果会报错的:TypeError: 'cmp' is an invalid keyword argument for this function

list1= [('david', 90), ('mary',90), ('sara',80),('lily',95)]
print(sorted(list1,key = lambda x: x[1]))
print(sorted(list1,key = lambda x: x[1]))
>>[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
>>[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

分别按照list1中的第一个元素和第二个元素大小进行排序的

argsort()函数是numpy库中的函数:argsort函数返回的是数组值从小到大的索引值

improt numpy as np
x=np.array([3,1,5,2,9,7])
print("argsort")
print(x)
y=np.argsort(x)
print(y)
for i in range(6):
    print(x[y[i]])
>>argsort
>>[3 1 5 2 9 7] 原始的x的list
>>[1 3 0 2 5 4] 从小到大大的索引:第一个为x[1]=1,第二为X[3]=2……
>>1
2
3
5
7
9

Two-dimensional array:二维数组

x=np.array([[0,3],[2,2]])
print("x",x)
print("按照列排序",np.argsort(x,axis=0))
print("按照行排序",np.argsort(x,axis=1))
>>按照列排序 [[0 1]
 [1 0]]
按照行排序 [[0 1]
 [0 1]]

升序和降序排列list:

x=np.array([3,1,5,2,9,7])
print(x)
print(x[np.argsort(x)])#升序排列
print(x[np.argsort(-x)])#降序排列
>>[3 1 5 2 9 7]
[1 2 3 5 7 9]
[9 7 5 3 2 1]










猜你喜欢

转载自blog.csdn.net/absent1353/article/details/80380827