2015-10-18 43 views
-4

如何有效地对字典进行二维排序 字典是这样的,我需要根据它的值的关键与最高值获得最低等级。如果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

的*什么*预期的输出?无论如何,你不能排序字典。你需要一个不同的数据结构。 – juanchopanza

+1

看起来你想按字典的值排序字典的键;那是对的吗?阅读[Python sorting howto](https://wiki.python.org/moin/HowTo/Sorting)可能会很好。 – Evert

+0

是否需要P和T(因为它们具有相同的值)具有相同的等级?或者排名第3和第4位是合适的,只要这些排序是按照字典顺序排列的。 – Evert

回答

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'] 

的塞康d排序不会更改以前排序的具有相同值的条目的顺序。

你也可以使用一个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引用,并遍历密钥。对于每个密钥,如果以前的value与此密钥的值不同,则会增加rank。由于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 
+0

它的工作原理。 Thnx ... – prime130392

+0

@ prime130392 - 我添加了一种方法来确定并保存每个键的等级。 – TigerhawkT3