按值排序字典然后按键排序

时间:2011-10-12 15:42:53

标签: python

这似乎必须是一个骗局,但我今天的搜索能力很差......

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

输入:

{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 个答案:

答案 0 :(得分:53)

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对于x中的每个项目y.items(),请使用(x[1],x[0])作为要排序的代理值。由于x的格式为(key,value)(x[1],x[0])的格式为(value,key)。这会导致sorted先按value排序,然后按key进行排序。

reverse=True告诉sorted以降序而不是升序显示结果。

有关使用Python进行排序的精彩教程,请参阅此wiki page

PS。我尝试使用key=reversed代替,但reversed(x)返回一个迭代器,这里没有根据需要进行比较。

答案 1 :(得分: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)]

答案 2 :(得分: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])