一.函数形式
sorted(iterable, cmp, key, reverse)
s.sort(cmp, key, reverse)
参数:
- cmp为用户定义的任何比较函数,函数的参数为任何两个可比较的元素(来自iterable或者list),函数根据第一个参数与第二个参数的关系依次返回-1、0、或者+1(第一个参数小于第二个参数则返回负数)。默认值为None
- key使带一个参数的函数,用来为每个元素提取比较值,默认为None(即直接比较每个元素)
- reverse表示排序结果是否反转,默认为False
- [注]从函数的定义形式可以看出,sorted作用于任意可迭代的对象,而sort()一般作用于列表。
二.常规排序
a = [1, 2, 4, 2, 3]
a.sort()
sorted(a)
- sort()直接修改原有列表,返回None
- sorted()返回一个排序后的列表,原有列表保持不变
三.sorted()根据自定义规则排序,使用参数key
1.按长度排序
# 使用key,默认搭配lambda函数使用
chars = ['is', 'a', 'handsome', 'oliver', 'boy']
#根据长度进行排序
sorted(chars,key=lambda x:len(x))
#Output: ['a', 'is', 'boy', 'oliver', 'handsome']
#按长度排序后反转
sorted(chars,key=lambda x:len(x),reverse=True)
#Output: ['handsome', 'oliver', 'boy', 'is', 'a']
2.按某位置的元素进行排序
#key=lambda x: x[1]中可以任意选定x中可选的位置进行排序
tuple_list = [('A', 1,5), ('B', 3,2), ('C', 2,6)]
sorted(tuple_list, key=lambda x: x[1])
#字典列表按字典的键值进行排序,负号表示逆序
persons = [{'name': 'Jon', 'age': 32}, {'name': 'Alan', 'age': 50}, {'name': 'Bob', 'age': 23}]
sorted(persons, key=lambda x: x['name'])
#Output: [{'name': 'Alan', 'age': 50}, {'name': 'Bob', 'age': 23}, {'name': 'Jon', 'age': 32}]
sorted(persons, key=lambda x: (x['name'], -x['age']))
#Output: [{'name': 'Alan', 'age': 50}, {'name': 'Bob', 'age': 23}, {'name': 'Jon', 'age': 32}]
3.按字典的键值进行排序
phonebook = {'Linda': 7750, 'Bob': 9345, 'Carol': 5834}
sorted(phonebook.items(), key=lambda x:x[1])
#Output: [('Carol', 5834), ('Linda', 7750), ('Bob', 9345)]
4.字典的键值为列表,按列表中某元素进行排序
mydict = {
'Li':['M',7],
'Zhang':['E',2],
'Wang':['P',3],
'Du':['C',2],
'Ma':['C',9],
'Zhe':['H',7]
}
sorted(mydict.items(),key=lambda x:x[1][1])
#Output: [('Zhang', ['E', 2]), ('Du', ['C', 2]), ('Wang', ['P', 3]), ('Li', ['M', 7]), ('Zhe', ['H', 7]), ('Ma', ['C', 9])]
四.sorted()使用operator 中的itemgetter方法进行自定义排序排序
1.按字典的值排序
from operator import itemgetter
phonebook = {'Linda': 7750, 'Bob': 9345, 'Carol': 5834}
sorted(phonebook.items(), key=itemgetter(1))
#Output:[('Carol', 5834), ('Linda', 7750), ('Bob', 9345)]
2.多维列表按列表中的字段排序
from operator import itemgetter
gameresult = [['Bob', 95.00, 'A'],['Alan', 86.0, 'C'],['Mandy', 82.5, 'A'], ['Rob', 86, 'E']]#姓名 成绩 等级
sorted(gameresult, key=itemgetter(1, 2)#第二个字段成绩相同时,按等级从低到高排序
#Output:[['Mandy', 82.5, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E'], ['Bob', 95.0, 'A']]