2015-10-18 40 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