2013-12-13 189 views
22

我想根據子鍵key3的值按降序對字典d進行排序。見下:python字典根據值降序排序

d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 

所以最終字典看起來像這樣。

d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
    } 

我的方法是形成從d,其主要是KEY3的值,然後使用方向相反的辭典E(排序(E)),但由於KEY3的值可以是相同的,所以詞典Ë失去了一些鑰匙和他們的價值。說得通?

我該如何做到這一點?這不是一個測試代碼。我只是想了解邏輯。

+1

以供將來參考,請記住,在幾乎任何語言的''dict''(S)固有的定義未排序。大多數鍵/值映射數據類型都是。請接受或不接受Zwinck的答案。 –

回答

36

Dictionaries do not have any inherent order。或者說,他們的固有秩序是「任意的,但不是隨機的」,所以它對你沒有任何好處。

用不同的術語,您的d和您的e將完全等同於字典。

你能在這裏做的是使用一個OrderedDict

from collections import OrderedDict 
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 }, 
     '124': { 'key1': 6, 'key2': 56, 'key3': 6 }, 
     '125': { 'key1': 7, 'key2': 44, 'key3': 9 }, 
    } 
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3'])) 
d_descending = OrderedDict(sorted(d.items(), 
            key=lambda kv: kv[1]['key3'], reverse=True)) 

原來d有一些任意順序。 d_ascending已將您的訂單想到您在原始d中,但沒有。而d_ascending的訂單要求爲您的e


如果你並不真正需要使用e視爲一個字典,你只是希望能夠遍歷的d以特定順序的元素,可以簡化這一點:

for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True): 
    do_something_with(key, value) 

如果您想要在任何更改中保持排序順序的字典而不是OrderedDict,則需要某種排序的字典。有許多可供選擇的選項,您可以在PyPI上找到,有些選項可以在樹上實現,還可以在OrderedDict之上進行重新排序等。

4

你可以使用下面的代碼的降序排列,並存儲到字典排序:

 listname = [] 
     for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True): 
      diction= {"value":value, "key":key} 
      listname.append(diction) 
2

列表

dict = {'Neetu':22,'Shiny':21,'Poonam':23} 
print sorted(dict.items()) 
sv = sorted(dict.values()) 
print sv 

字典

d = [] 
l = len(sv) 
while l != 0 : 
    d.append(sv[l - 1]) 
    l = l - 1 
print d` 
17

短考試PLE排序字典desending爲了

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30} 
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True) 
for r in a1_sorted_keys: 
    print r, a1[r] 

下面將要輸出

e 30 
b 13 
d 4 
c 2 
a 1