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

Omi*_*nus 39 python sorting

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

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]
Run Code Online (Sandbox Code Playgroud)

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

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]
Run Code Online (Sandbox Code Playgroud)

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

TIA,PK

Ste*_*ski 47

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

L 现在包含:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]
Run Code Online (Sandbox Code Playgroud)

  • @Ominus:“-k[1]”翻转整数上的符号,从而反转它们的自然排序顺序。您不能执行“-k[0]”,因为该值是一个字符串。因此,“reverse=True”会反转排序顺序,“-k[1]”会取消第二个元素的反转。 (3认同)

mhy*_*itz 38

可以连续几轮排序,因为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]]
Run Code Online (Sandbox Code Playgroud)

  • 如果第二个排序键没有相反的(如时间、字符串...),这将是要走的路,因为在这种情况下不能使用接受的答案。 (3认同)