对嵌套列表排序,先升序再降序

54 投票
3 回答
51592 浏览
提问于 2025-04-16 21:21

如果我有一个包含列表的列表,像这样

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

我该如何排序,使得第一个元素是降序排列,而第二个元素是升序排列,最终结果看起来像这样

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

使用 itemgetter 我可以对第一个元素进行降序排序,但如果我再对第二个元素进行排序,那就会破坏之前的排序。我不能使用组合键,因为它需要先降序排序,然后再升序排序。

3 个回答

4

类似这样的内容:

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()这个函数的实现中,返回的值可以取反,这样就能实现不同的排序方式。

50

你可以进行多轮排序,因为Python的 sort 是一种 稳定的排序。不过,你需要先根据 次要关键字 进行排序。详细信息可以参考 官方指南

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]]
70
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]]

撰写回答