Posts

Showing posts from December, 2018

python3自定义排序规则

python3的sort不支持关键字cmp了,只支持关键字key,这个时候想要自定义复杂的排序规则就有点麻烦了。 首先key是什么呢?其实是个callable或者class。如果是callable,那么这个key做了什么事呢? 例如: 1 2 3 4 5 a = [ 1 , 2 , 3 ] def F (x): return x + 1 a . sort(key = F) 本质上,python会把a的每一个元素都调用key(F)函数的得到返回值b 1 2 3 b = [] for i in a: b . append(F(i)) 然后就是拿b去比较大小了。 这样存在一个问题,python每次只扔a的一个元素到key里,所以key对应的callable只能包含一个形参,这个让人非常无语。当实现复杂的排序规则时,往往要比较两个元素,例如: 1 a = [( 'bb' , 'cc' ), ( 'aa' , 'bb' ), ( 'bb' , 'aa' )] 当想要按照tuple的第一个关键字递增排序,在第一个关键字相同的情况下,按照第二关键字递减排序,这个就麻烦大了。 当然python提供了一个叫做functools.cmp_to_key的东西来帮助解决这个问题。 先上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import functools a = [( 'bb' , 'cc' ), ( 'aa' , 'bb' ), ( 'bb' , 'aa' )] def cmp_1 (x, y): if x == y: return 0 if x < y: return - 1 return 1 def ...