sort() 和 sorted()的key的写法,可以总结为,迭代器中的单个元素的操作,比如sort()二维列表,假设它有5行5列,我们想以每行的最后一个元素为key进行排序。那么key = lambda: x:x[-1],这里的x可以理解为每一行。
1.sort()
list.sort(key=function, reverse=boolean)
sort是列表list的对象函数,list.sort()直接修改list,这里的key可以说lambda x:
boxes=[[0, 0, 4, 4, 0.85],
[0, 0, 3, 3, 0.8],
[0, 0, 2, 2, 0.7],
[0, 0, 2, 2, 0.9],
[0, 0, 1, 1, 0.5]] # boxes是一个列表
boxes.sort(key=lambda boxes:boxes[-1])
新boxes以最后一个维度的大小进行排序
boxes=
[[0, 0, 1, 1, 0.5],
[0, 0, 2, 2, 0.7],
[0, 0, 3, 3, 0.8],
[0, 0, 4, 4, 0.85],
[0, 0, 2, 2, 0.9]]
如果加上reverse=True,那么boxes顺序就从大到小
2.1 sorted
list = sorted(iterable, key=None, reverse=False)
sorted是python的一个内置函数,接受的是一个迭代器,而不仅仅是列表,它的用途比sort()更广泛,它返回的是一个列表,而迭代器本身不会改变。
#对列表进行排序
a = [5,3,4,2,1]
print(sorted(a))
[1, 2, 3, 4, 5]
#对元组进行排序
a = (5,4,3,1,2)
print(sorted(a))
[1, 2, 3, 4, 5]
#对集合进行排序
a = {1,5,3,2,4}
print(sorted(a))
[1, 2, 3, 4, 5]
#对字符串进行排序
a = "51423"
print(sorted(a))
['1', '2', '3', '4', '5']
b = 'adcbfhg'
print(sorted(b))
['a', 'b', 'c', 'd', 'f', 'g', 'h']
#a不是迭代器,a.items()才是迭代器
#字典默认按照key进行排序
a = {4:1,5:2,3:3,2:6,1:8}
sorted(a.items())
相当于sorted(a.items, key= lambda x:x[0])
结果为 [(1, 8), (2, 6), (3, 3), (4, 1), (5, 2)]
如果想以字典的values进行排序
则是sorted(a.items, key= lambda x:x[1])
结果为[(4, 1), (5, 2), (3, 3), (2, 6), (1, 8)]
2.2 sorted进阶
二维list排序
from operator import itemgetter
boxes=[[0, 0, 4, 4, 0.85],
[0, 0, 3, 3, 0.8],
[0, 0, 2, 2, 0.7],
[0, 0, 2, 2, 0.9],
[0, 0, 1, 1, 0.5]]
sorted(boxes, key=lambda x:x[-1])
l1 = [['Bob', 95.00, 'A'], ['Alan', 86.0, 'C'], ['Mandy', 82.5, 'A'], ['Rob', 86, 'E']]
名字 成绩 成绩等级
# 按先按成绩等级升序,相同成绩等级再按成绩数值升序
print(sorted(l1, key=itemgetter(2, 1), reverse=False))
[[‘Mandy’, 82.5, ‘A’], [‘Bob’, 95.0, ‘A’], [‘Alan’, 86.0, ‘C’], [‘Rob’, 86, ‘E’]]
# 按先按成绩等级升序,再按成绩数值降序
print(sorted(l1, key=lambda x:(x[2], -x[1]), reverse=False))
[['Bob', 95.00, 'A'], ['Mandy', 82.5, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']]
list中混合字典
from operator import itemgetter
l2 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
# 先按照成绩降序排序,相同成绩的按照名字升序排序:
print(sorted(l2, key=lambda x:(-x['score'], x['name'])))
# 先按照成绩降序升序,相同成绩的按照名字升序排序,最后取高到低的排序
print(sorted(l2, key=itemgetter('score', 'name'), reverse=True))
字典中混合list
d1 = {'Li': ['M', 7], 'Zhang': ['E', 2], 'Wang': ['P', 3], 'Du': ['C', 2], 'Ma': ['C', 9], 'Zhe': ['H', 7]}
# 按value(list)里的数组升序,再按字母降序
#这里介绍一下lambda x:x[1][1] 首先x[1]代表values,相对的x[0]代表keys
#而lambda x:x[1][1]意思是按照values的第[1]个值进行排序
print(sorted(d1.items(), key=lambda x:(x[1][1], -ord(x[1][0]) )))
#注意对字符比较需要ord。如果是'123'字符串数字可以使用int。
# sort返回的是list,如果需要转为dict,再sorted前面套一个dict()就可以了
print(dict(sorted(d1.items(), key=lambda x:(x[1][1], -ord(x[1][0]) ))))