按值再按键排序字典

58

这似乎是一个重复的问题,但我的搜索技能今天不太好...

假设我有一个整数键/值的字典,如何按值降序排列字典,然后按键降序排列(对于相同的值)。

输入:

{12:2, 9:1,  14:2}
{100:1, 90:4, 99:3, 92:1, 101:1}

输出:

[(14,2), (12,2), (9,1)]  # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)]
3个回答

95
In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1}
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True)
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]
key=lambda x: (x[1],x[0])参数告诉sorted函数,对于每个y.items()中的项x,使用(x [1],x [0])作为排序的代理值。因为x的形式是(key,value),所以(x [1],x [0])将产生(value,key)。这使得sorted首先按value进行排序,然后按key进行比较。 reverse=True参数告诉sorted按降序而不是升序呈现结果。
请参考此维基页面中有关Python排序的教程。
PS. 我尝试使用key=reversed,但是reversed(x)返回一个迭代器,无法在此处进行比较。

我没有得到相同的输出... 我捕获了第一版答案,它正是我所需要的。 - Austin Salonen
2
不错,但有点神秘...但我想不出更简单的东西。 - Don
7
如果我需要先按值升序排列,然后按键降序排列呢? - user9875189
@user9875189 我会使用负数来按键(x[1],-x[0])进行降序排序。当 n>0 时,应该适用于整数。 - Geoffroy CALA

2
也许这更加明确:
>>> y = {100:1, 90:4, 99:3, 92:1, 101:1}
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1))
>>> sorted(y.items(), cmp=reverse_comparison)
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]

0

试试这个:

>>> d={100:1, 90:4, 99:3, 92:1, 101:1}
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接