python中排序简单小结
Python中内置的排序方法
- Python列表中
list.sort()
方法可直接修改原列表对象排序
sorted()
函数对可迭代对象排序并返回新的列表对象
直接用简单函数进行简单的排序
1 2 3
| a = [5,3,2,1] b = sorted(a) print(a,"\n",b)
|
[5, 3, 2, 1]
[1, 2, 3, 5]
[2, 3, 4]
关键函数排序
list.sort()和sorted()
函数都有一个key参数,key形参的值应是函数,他接受一个参数并返回一个用于排序的键
函数中参数reverse控制升序降序,默认reverse=False,即升序
[1, 3, 4, 5]
1
| sorted([3,1,4,5],reverse=True)
|
[5, 4, 3, 1]
str.lower按照小写进行排序,忽略大小写
1
| sorted("This is a test string from Andrew".split(), key=str.lower)
|
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
常使用对象的一些索引作为键对复杂对象进行排序
1 2
| student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10)] sorted(student_tuples,key=lambda student:student[2])
|
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同样的方法也可以用于命名属性的对象
1 2 3 4 5 6 7
| class Student: def __init__(self, name, grade, age): self.name = name self.grade = grade self.age = age def __repr__(self): return repr((self.name, self.grade, self.age))
|
1 2 3 4 5
| student_objects = [ Student('john', 'A', 15), Student('jane', 'B', 12), Student('dave', 'B', 10), ]
|
1
| sorted(student_objects, key=lambda student: student.age)
|
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Operator函数块
可以利用Operator的访问器功能更容易、快捷,将operator模块的itemgetter()、attrgetter()、methodcaller()函数作为sorted()
的键函数。
1
| from operator import itemgetter, attrgetter
|
1
| sorted(student_tuples,key=itemgetter(2))
|
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
1
| sorted(student_objects, key=attrgetter('age'))
|
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
可以对多个关键字进行排序
1
| sorted(student_tuples, key=itemgetter(1,2))
|
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
Numpy中数组排序
直接排序
和python内建的列表类型相似,Numpy数组可以使用sort方法按位置排序,np.sort方法返回的是已经排好序的数组拷贝,而不是对原数组的原位置排序
1 2
| arr= np.random.randn(3) arr
|
array([-1.35092935, -0.58342412, -0.8207302 ])
array([-1.35092935, -0.8207302 , -0.58342412])
1 2 3
| arr1 = np.random.randn(5,3) arr1
|
array([[ 1.80974897, -0.31702384, 0.39830353],
[-0.96726721, 0.38100404, 0.31633181],
[ 0.47419492, -0.44129861, 0.47946414],
[ 1.12581458, 0.43486315, -1.99929904],
[ 1.19119537, 1.24635077, -1.26876347]])
array([[-0.31702384, 0.39830353, 1.80974897],
[-0.96726721, 0.31633181, 0.38100404],
[-0.44129861, 0.47419492, 0.47946414],
[-1.99929904, 0.43486315, 1.12581458],
[-1.26876347, 1.19119537, 1.24635077]])
间接排序
在数据排序中,可能需要通过一个或多个键对数据进行排序,比如给定学生的数据,需要先按班级排序,再成绩排序,这是间接排序。
Numpy中提供了两个方法:argsort() 和 numpy.lexsort(), 可以先获得整数索引数组(索引器),索引数组的元素是原数组中相应元素的索引,然后将原数组重新排列成索引数组指定的顺序。
argsort()函数是将原始数组中的元素从小到大排列,提取其对应的index(索引
1 2
| arr2= np.array([5,0,1,3,2]) arr2
|
array([5, 0, 1, 3, 2])
1 2
| index = arr2.argsort() index
|
array([1, 2, 4, 3, 0], dtype=int64)
array([0, 1, 2, 3, 5])
1 2 3
| arr3= np.random.randn(5,3) arr3
|
array([[ 0.50369183, -0.14320525, 1.17931436],
[-0.46240806, 1.1170554 , -0.17238359],
[ 0.59020501, -0.71495542, -0.97350068],
[-0.40442428, -1.09054876, -0.71871284],
[-2.43518373, 0.90166379, -0.39092172]])
1 2
| index0 = arr3.argsort(axis =0) index0
|
array([[4, 3, 2],
[1, 2, 3],
[3, 0, 4],
[0, 4, 1],
[2, 1, 0]], dtype=int64)
1 2
| index1 =arr3.argsort(axis = 1) index1
|
array([[1, 0, 2],
[0, 2, 1],
[2, 1, 0],
[1, 2, 0],
[0, 2, 1]], dtype=int64)
Pandas中的排序
在Pandas中有两种排序方式,按索引排序:sort_index();按值排序:sort_values()。
1 2 3 4
| import pandas as pd ser = pd.Series(range(5),index=['a','e','d','s','o']) ser
|
a 0
e 1
d 2
s 3
o 4
dtype: int64
a 0
d 2
e 1
o 4
s 3
dtype: int64
1 2 3
| df = pd.DataFrame(np.arange(8).reshape((2,4)),index = ['one','three'],columns = ['d','a','b','c']) df
|
|
d |
a |
b |
c |
one |
0 |
1 |
2 |
3 |
three |
4 |
5 |
6 |
7 |
1
| df.sort_index(axis = 1, ascending = False)
|
|
d |
c |
b |
a |
one |
0 |
3 |
2 |
1 |
three |
4 |
7 |
6 |
5 |
1
| df.sort_values(axis = 0, ascending = False, by = ['a','c'])
|
|
d |
a |
b |
c |
three |
4 |
5 |
6 |
7 |
one |
0 |
1 |
2 |
3 |