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

2024-07-07 08:35:48 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个列表,其中包含一个看起来像这样的列表。。。

['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上反向传递,但是我随后使用元素,当然这会破坏前面的排序。我不能做组合键,因为它需要先按降序排序,然后按升序排序。

蒂亚, 主键


Tags: 元素列表排序主键升序组合键降序itemgetter
3条回答
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]]

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

有点像

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()实现中的返回值可以取反。

相关问题 更多 >