Python的多条件排序 -- 基于Tuple大小比较的语法糖

看到了个比较有趣的帖子,是关于Python列表排序的,参看:知乎的这个帖子

例子不难:

1
2
3
4
5
# 列表排序:先按照正负排序,再按照其绝对值排序
a = [1, -2, 10, -12, -4, -5, 9, 2]
a.sort(key=lambda x: (x < 0, abs(x)))
[1, 2, 9, 10, -2, -4, -5, -12]

其中,诡异的就是作为key的lambda函数了。

1
key=lambda x: (x < 0, abs(x))

一个返回tuple的函数,作为key,就可以实现多级排序。什么鬼?!

仔细查了下文档,发现原理是tuple的大小比较……

  1. 首先,看这个贴子,描述了Tuple的大小比较原则。简而言之,长度要一样,先比较第一个元素,再比较第二个元素。
  2. 然后,看Python中Sort的原理。简而言之,key作为真正参与cmp的数,可以理解为排序中,每个item的参与比较的“值”(默认就是item)。

So,调整key,使之生成一个Tuple。Tuple的顺序,就是item的排序优先级。

上例中(x<0, abs(x)),就是先定义了item的value根据和0比较的值排序。因为True>False.所以复数大,所以排到后面。后面,abs的比较就不说了。

PS:好久不写。手生了……