Python 排序方法list.sort()和sorted()

list.sort()

List的成员函数,所以仅适用list排序,原址排序

1
2
3
4
5
6
7
8
sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
# cmp -- 比较函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
# key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
# reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
# 返回值:None
# 注: Python3开始取消cmp参数

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
list_a = [26, 2, 10, 20, 11, 8]
list_a.sort()
print(list_a)
#[2, 8, 10, 11, 20, 26]

list_b = ['Way-26','Way-2','Way-10','Way-20','Way-11','Way-8']
list_b.sort(key=lambda x : int(x[4:]))
print(list_b)
#['Way-2', 'Way-8', 'Way-10', 'Way-11', 'Way-20', 'Way-26']

list_c = ['Way-26','Way-2','Way-10','Way-20','Way-11','Way-8']
list_c.sort(cmp=lambda x,y : int(x[4:])-int(y[4:]))
print(list_c)
#['Way-2', 'Way-8', 'Way-10', 'Way-11', 'Way-20', 'Way-26']

list_d = ['Way-26','Way-2','Way-10','Way-20','Way-11','Way-8']
list_d.sort(cmp=lambda x,y : y-x, key=lambda x : int(x[4:]))
print(list_d)
#['Way-26', 'Way-20', 'Way-11', 'Way-10', 'Way-8', 'Way-2']

sorted()

内建函数,适用于任何可迭代对象,返回排序后的对象

1
2
3
4
5
6
7
8
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
# iterable -- 可迭代对象。
# cmp -- 比较函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
# key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代 对象中的一个元素来进行排序。
# reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
# 返回值:排序后的对象
# 注: Python3开始取消cmp参数

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
iter_a = [dict(num=26),dict(num=2),dict(num=10),dict(num=20),dict(num=11),dict(num=8)]
result = sorted(iter_a, key=lambda x: x['num'], reverse=True)
print(result)
#[{'num': 26}, {'num': 20}, {'num': 11}, {'num': 10}, {'num': 8}, {'num': 2}]

# 利用operator.itemgetter模块排序元组
from operator import itemgetter
iter_b = [
('Wayde', 28, 90),
('Peter', 23, 80),
('Bob', 32, 100),
]
result = sorted(iter_b, key=itemgetter(2))
print(result)
#[('Peter', 23, 80), ('Wayde', 28, 90), ('Bob', 32, 100)]

# 利用operator.attrgetter模块排序元组
from operator import attrgetter
class Student(object):
def __init__(self, *args, **kwargs):
self.name = kwargs['name']
self.age = kwargs['age']
self.score = kwargs['score']

def __repr__(self):
return repr(self.name)

iter_c = [
Student(name='Wayde', age=28, score=90),
Student(name='Peter', age=23, score=80),
Student(name='Bob', age=32, score=100),
Student(name='Jack', age=28, score=95),
Student(name='Aaron', age=35, score=90),
]

result = sorted(iter_c, key=attrgetter('age'))
print(result)
#['Peter', 'Aaron', 'Wayde', 'Jack', 'Bob']

# 多级排序
result = sorted(iter_c, key=attrgetter('score','age'))
print(result)
#['Peter', 'Wayde', 'Aaron', 'Jack', 'Bob']

参考资料:
Python中sorted函数的用法