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

59 投票
3 回答
63209 浏览
提问于 2025-04-17 04:10

这看起来应该是个重复的问题,但我今天搜索的能力不太行……

假设我有一个整数作为键和值的字典,我该怎么把这个字典按值从大到小排序,然后如果有相同的值,再按键从大到小排序呢?

输入:

{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

试试这个:

>>> 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])
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)]
96
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 排序,如果有相同的 value,再按照 key 来决定顺序。

reverse=True 是告诉 sorted 函数把结果按降序排列,而不是升序。

想了解更多关于 Python 排序的内容,可以查看这个 维基页面,里面有很好的教程。

另外,我试过用 key=reversed,但 reversed(x) 返回的是一个迭代器,这在这里无法进行比较。

撰写回答