python中的sort()和sorted

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]) ))))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值