Python排序列表/升序然后降序

时间:2011-07-12 15:27:04

标签: python sorting

如果我的列表包含一个看起来像这样的列表......

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]

我如何对它们进行排序,以便元素0按降序排序,元素1按升序排序,因此结果看起来像......

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]

使用itemgetter我可以在元素0上反向传递,但是我然后使用元素,当然它会破坏前一种类型。我不能做一个组合键,因为它需要先降序然后升序。

TIA, PK

3 个答案:

答案 0 :(得分:43)

L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (k[0], -k[1]), reverse=True)

L现在包含:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

答案 1 :(得分:35)

可以连续几轮排序,因为python的sortstable。您需要先对辅助密钥进行排序。另请参阅official HOW TO

from operator import itemgetter
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]]
l.sort(key=itemgetter(1))
l.sort(key=itemgetter(0), reverse=True)
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

答案 2 :(得分:2)

这样的东西
def mycmp(a, b):

  res = cmp(a[0], b[0])
  if res == 0:
     return cmp(a[1], b[1])
  return res

newlist = sorted(input_list, cmp=mycmp)

比较方法首先检查每个元素的第一项。如果它们相等,它将检查每个元素的第二项。为了实现不同的排序行为,可以取消mycmp()实现中的返回值。

相关问题