5.23 如何实现字典的多级排序 =========================== .. image:: http://image.iswbm.com/20200804124133.png 在一个列表中,每个元素都是一个字典,里面的每个字典结构都是一样的。 里面的每个字典会有多个键值对,根据某个 key 或 value 的值大小,对该列表进行排序,使用 sort 函数就可以轻松实现。 .. code:: python >>> 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 函数也能实现,方法如下: .. code:: python >>> 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 上,前面加一个负号,就会把顺序给颠倒过来。 还是以上面为例,我现在要实现先按成绩降序,如果成绩一致,再按年龄升序。可以这样写 .. code:: python >>> 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'}]