在Python中按值排序字典,保持相同值的键顺序

3 投票
2 回答
2485 浏览
提问于 2025-04-18 14:52

假设有一个字典

d = {"P1":77,"P2":89,"P3":77}

我想把结果打印成下面的格式

P2: 89

P1: 77

P3: 77

也就是说,要根据字典里的值进行排序,如果值相同,先出现的那个排在前面(也就是P1要排在P3前面)

我做了以下操作

import collections
od = collections.OrderedDict(sorted(d.items(), key=lambda x:x[1], reverse=True))

得到的结果是

OrderedDict([('P2', 89), ('P3', 77), ('P1', 77)])

我该怎么才能让P1排在P3前面呢?

2 个回答

2

这样做:

od = collections.OrderedDict(sorted(d.items(), key = lambda x:(-x[1],x[0])))

正如@Padraic所说,“你不能同时从高到低和从低到高排序。”所以,你需要通过一种方法让排序函数把最高的数字当成最低的数字来看待。这样,它就会按照正常的顺序进行排序。

2

Python中的sort是一个稳定的排序,这意味着如果两个项目的值相等,它们的顺序会保持不变。如果你从一个OrderedDict开始,只根据值进行排序,键的顺序会保持原样。不过,在你的情况下,应该用一个直接从高到低排序的关键字来排序,而不是先排序再反转,这样可以保持键的顺序不变。

示例

from collections import OrderedDict
d = OrderedDict([('P1',77),('P2',89),('P3',77)])
print sorted(d.items(),key=lambda x:-x[1])
d = OrderedDict([('P3',77),('P2',89),('P1',77)])
print sorted(d.items(),key=lambda x:-x[1])

输出

[('P2', 89), ('P1', 77), ('P3', 77)]
[('P2', 89), ('P3', 77), ('P1', 77)]

撰写回答