python基于值排序字典,并且如果值重复,则基于键排序

时间:2015-10-18 07:25:03

标签: python sorting dictionary

如何有效地对二维字典进行排序  字典是这样的,我需要根据其值键对每个键进行排名,最高值获得最低排名。如果2个键具有相同的值,则它们按字典顺序排序:

d = {'T': 1500, 'L': 1000, 'P': 1500, 'G': 6500, 'B': 7000}

预期产出:

1 :  B
2 :  G
3 :  P
3 :  T
4 :  L

这里由于重复了T和P的值,所以它们按字母顺序排序

1 个答案:

答案 0 :(得分:3)

首先按键排序,然后按降序值排序:

>>> d = {'T': 1500, 'L': 1000, 'P': 1500, 'G': 6500, 'B': 7000}
>>> sorted(sorted(d), key=d.get, reverse=True)
['B', 'G', 'P', 'T', 'L']

第二种排序不会更改先前排序的具有相同值的条目的顺序。

您还可以使用tuple按多个键排序:

>>> d = {'T': 1500, 'L': 1000, 'P': 1500, 'G': 6500, 'B': 7000}
>>> sorted(d, key=lambda x: (-d.get(x), x))
['B', 'G', 'P', 'T', 'L']

为具有相同值的键指定相同的“等级”:保存已排序的list个键,初始化rankvalueranks个引用,并遍历键。对于每个密钥,如果之前的rank与此密钥的值不同,则value会增加。由于True相当于1False相当于0,因此我们只需将此比较的结果直接添加到rank即可。然后,我们保存当前密钥value以与下一个密钥进行比较。最后,将其添加到ranks字典中,其中key为关键字,rank为值。

>>> value = 0
>>> rank = 0
>>> ranks = {}
>>> for key in s:
...     rank += value != d[key]
...     value = d[key]
...     ranks[key] = rank
...

现在可以轻松遍历此词典并打印您要查找的结果:

>>> for k in s:
...     print('{}: {}'.format(ranks[k], k))
...
1: B
2: G
3: P
3: T
4: L