按第二个值排序元组列表,reverse = True,然后按键,reverse = False

Nic*_*ung 28 python sorting reverse dictionary

我需要首先对字典进行排序,使用值进行排序reverse=True,对于重复值,按键排序,reverse=False

到目前为止,我有这个

dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True)
Run Code Online (Sandbox Code Playgroud)

返回......

[('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)]
Run Code Online (Sandbox Code Playgroud)

但我需要它:

[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,当值相等时,我只能按指定的方式对键进行排序......但是如何让它们以越来越多的方式排序呢?

mgi*_*son 42

以下适用于您的输入:

d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(d,key=lambda x:(-x[1],x[0]))
Run Code Online (Sandbox Code Playgroud)

由于您的"值"是数字,因此您可以通过更改符号轻松反转排序顺序.

换句话说,这种排序按值(-x[1])(负号首先放大数字)排序,然后对于相同的数字,它按照键(x[0])排序.

如果您的价值不能轻易被"否定"以放置大项目,那么简单的解决方法是排序两次:

from operator import itemgetter
d.sort(key=itemgetter(0))
d.sort(key=itemgetter(1),reverse=True)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为python的排序是稳定的.

  • 对于上面的例子,如果使用 itemgetter 方法,优先级是相反的: `d.sort(...)` <--3rd prio `d.sort(...)` <--2nd prio `d.sort(...)` <--第一优先级 (2认同)

NPE*_*NPE 5

In [4]: l = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]

In [5]: sorted(l, key=lambda (x,y):(-y,x))
Out[5]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
Run Code Online (Sandbox Code Playgroud)