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]
1
2
3
a= [4,3,2]
a.sort()
a
[2, 3, 4]

关键函数排序

list.sort()和sorted()函数都有一个key参数,key形参的值应是函数,他接受一个参数并返回一个用于排序的键

函数中参数reverse控制升序降序,默认reverse=False,即升序

1
sorted([3,1,4,5]) # 升序
[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])#按照student的年龄排序
[('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)   # sort by 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
import numpy as np
1
2
arr=  np.random.randn(3)
arr
array([-1.35092935, -0.58342412, -0.8207302 ])
1
2
arr.sort()
arr
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]])
1
2
arr1.sort(1)
arr1
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)
1
arr2[index]
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
# Series
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
1
ser.sort_index()
a    0
d    2
e    1
o    4
s    3
dtype: int64
1
2
3
# DataFrame
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