5.23 如何实现字典的多级排序

image0

在一个列表中,每个元素都是一个字典,里面的每个字典结构都是一样的。

里面的每个字典会有多个键值对,根据某个 key 或 value 的值大小,对该列表进行排序,使用 sort 函数就可以轻松实现。

>>> students = [{'name': 'Jack', 'age': 17, 'score': 89}, {'name': 'Julia', 'age': 17, 'score': 80}, {'name': 'Tom', 'age': 16, 'score': 80}]
>>> students.sort(key=lambda student: student['score'])
>>> students
[{'age': 17, 'score': 80, 'name': 'Julia'}, {'age': 16, 'score': 80, 'name': 'Tom'}, {'age': 17, 'score': 89, 'name': 'Jack'}]

如果两名同学的成绩一样,那谁排在前面呢?

那就再额外再定个第二指标呗,成绩一样,就再看年龄,年龄小的,成绩还能一样,那不是更历害嘛 。

规则定下了:先按成绩降序,如果成绩一致,再按年龄降序。

问题来了,这样的规则,代码该如何实现呢?

用字典本身的 sort 函数也能实现,方法如下:

>>> students = [{'name': 'Jack', 'age': 17, 'score': 89}, {'name': 'Julia', 'age': 17, 'score': 80}, {'name': 'Tom', 'age': 16, 'score': 80}]
>>> students.sort(key=lambda student: (student['score'], student['age']))
>>> students
[{'age': 16, 'score': 80, 'name': 'Tom'}, {'age': 17, 'score': 80, 'name': 'Julia'}, {'age': 17, 'score': 89, 'name': 'Jack'}]

那如果一个降序,而另一个是升序,那又该怎么写呢?

很简单,只要在对应的 key 上,前面加一个负号,就会把顺序给颠倒过来。

还是以上面为例,我现在要实现先按成绩降序,如果成绩一致,再按年龄升序。可以这样写

>>> students = [{'name': 'Jack', 'age': 17, 'score': 89}, {'name': 'Julia', 'age': 17, 'score': 80}, {'name': 'Tom', 'age': 16, 'score': 80}]
>>> students.sort(key=lambda student: (student['score'], -student['age']))
>>> students
[{'age': 17, 'score': 80, 'name': 'Julia'}, {'age': 16, 'score': 80, 'name': 'Tom'}, {'age': 17, 'score': 89, 'name': 'Jack'}]

image1