python list sort学习


前言

刷题的时候遇到要对一个列表里第一个元素升序,在第一个元素相同的时候降序的操作。
python应该有简单的方法所以顺便总结一下python list 里的sort

1. 基本排序

在python中有两种排序方法

  1. sorted(iterable, cmp=None, key=None, reverse=False)
    iterable – 可迭代对象。
    key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
  2. list.sort(cmp=None, key=None, reverse=False)

简单的升序排序非常简单:只需调用 sorted() 函数。它返回一个新的排序后列表
你也可以使用 list.sort() 方法,它会直接修改原列表(并返回 None 以避免混淆),通常来说它不如 sorted() 方便 ——— 但如果你不需要原列表,它会更有效率。

a = [2,5,3,4,6,8,5]
print('sorted a is: ',sorted(a))
# sorted a is:  [2, 3, 4, 5, 5, 6, 8]
a.sort()
print('sorted a is: ',a)
# sorted a is:  [2, 3, 4, 5, 5, 6, 8]

2. 使用key排序

students = [(‘jane’,‘B’, 16), (‘dave’,‘A’, 14), (‘Amy’, ‘C’, 15), (‘john’,‘A’, 15), (‘Bob’, ‘B’, 14),]

按成绩排序

key = lambda x: x[1]

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
sorted(students, key = lambda x: x[1]) 
students.sort(key = lambda x: x[1])
print(students)
# [('dave', 'A', 14), ('john', 'A', 15), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]

成绩相同按年龄降序

上面结果中(‘dave’, ‘A’, 14), (‘john’, ‘A’, 15)成绩相同,年龄是升序, 想变成降序

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
def multisort(s, specs):
    for keyid, reverse in reversed(specs):
        s.sort(key = lambda x: x[keyid], reverse = reverse)
    return s
print(multisort(students, ((1, False),(2, True))))
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]

可以看见结果中前两项发生了反转, 按年龄降序排列了。
注意这里对specs遍历的时候是反向遍历的

还有一种相对简单的写法
如果需要降序的是数字的话可以这样, 因为数字的负数升序就是原数组降序

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
print(sorted(students, key = lambda x: (x[1], -x[2])) )
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值