我正在调查this关于使用多个条件排序列表列表的问题(元素0降序,元素1升序)。
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (-k[0], k[1]), reverse=True)
当第一个或第二个元素是字符串时,有没有办法让它工作?
答案 0 :(得分:3)
这很简单,只需使用-ord
作为字符串:
L.sort(key=lambda k: (-ord(k[0]), k[1]), reverse=True)
输出:
In [1]: L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
In [2]: L.sort(key=lambda k: (-ord(k[0]), k[1]), reverse=True)
In [3]: L
Out[3]: [['a', 3], ['a', 2], ['a', 1], ['b', 3], ['b', 2], ['b', 1]]
您可以通过不使用reverse和取消int值来获得完全相同的结果:
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (k[0], -k[1]))
print(L)
[['a', 3], ['a', 2], ['a', 1], ['b', 3], ['b', 2], ['b', 1]]
因此,对于字符串和整数的混合,您实际上并不需要cmp,ord或其他任何否定int值的内容。
答案 1 :(得分:1)
由于您要反转第二个字符串的排序顺序,因此使用key
函数无法正常工作。但是,使用cmp
函数将起作用:
L.sort(cmp=lambda x, y: cmp(x[0], y[0]) or -cmp(x[1], y[1]))