使用字符串按升序和降序对列表进行排序

时间:2015-06-06 08:14:39

标签: python sorting

我正在调查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)

当第一个或第二个元素是字符串时,有没有办法让它工作?

2 个答案:

答案 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]))