python字典基于值按降序排序

时间:2013-12-13 23:38:25

标签: python dictionary

我想基于子键key3的值按降序对该字典d进行排序。见下文:

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形成另一个字典e,其键值为key3然后使用reverse(sorted(e))但由于key3的值可以相同,所以字典e丢失了一些键和它们的值。有意义吗?

我怎么能做到这一点?这不是经过测试的代码。我只是想了解逻辑。

10 个答案:

答案 0 :(得分:50)

Dictionaries do not have any inherent order。或者说,它们的固有顺序是“任意但不随意”,所以它对你没有任何好处。

换句话说,您的de将完全等同于词典。

您可以在此处使用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之上,根据需要重新排序等等。

答案 1 :(得分:29)

排序字典的简短示例是降序

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

答案 2 :(得分:5)

您可以使用以下代码按降序排序并存储到字典中:

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

答案 3 :(得分:4)

根据定义,Python dicts没有排序。您不能对它进行排序,也不能通过插入方式控制元素的顺序。你可能想看看collections.OrderDict,它甚至附带了一个小教程,几乎就是你要做的事情:http://docs.python.org/2/library/collections.html#ordereddict-examples-and-recipes

答案 4 :(得分:4)

您可以使用运算符按降序对字典进行排序。

import operator

d = {"a":1, "b":2, "c":3}
cd = sorted(d.items(),key=operator.itemgetter(1),reverse=True)

排序后的字典看起来像

cd = {"c":3, "b":2, "a":1}

operator.itemgetter(1)在此处获取索引1处的键值。

答案 5 :(得分: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`

答案 6 :(得分:1)

排序字典' in_dict'按递减顺序的值

sorted_dict = {r: in_dict[r] for r in sorted(in_dict, key=in_dict.get, reverse=True)}
上面的例子

sorted_d = {r: d[r] for r in sorted(d, key=d.get('key3'), reverse=True)}

答案 7 :(得分:0)

只要有一个字典,其中的值是整数,与字典相比,Counter数据结构通常是表示数据的更好选择。

如果您已经有字典,则可以通过以下方式轻松组成计数器:

c = Counter(d['123'])

以您的数据为例。

通过most_common功能可以轻松访问柜台中物品的降序

有关Counter数据结构的更完整的介绍位于https://docs.python.org/2/library/collections.html

答案 8 :(得分:0)

您可以使用 dictRysan 库。我认为这将解决您的任务。

import dictRysan as ry

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

changed_d=ry.nested_2L_value_sort(d,"key3",True)
print(changed_d)

答案 9 :(得分:0)

f= {273: 6, 272: 2, 2: 1, 3083: 1, 281: 1, 2490: 5, 366: 5, 1945: 4, 869: 1, 1398: 1, 1920: 5, 3061: 2, 862: 1}
        
sorted_d = dict( sorted(f.items(), key=operator.itemgetter(1),reverse=True))

print('Dictionary in descending order by value : ',sorted_d)