2013-12-13 137 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