按值排序多维字典并在Python中返回新排序的字典

Ton*_*ana 0 python sorting dictionary python-2.7

下面是我的样本字典.

    my_dict = {  
       '003':{  
          'class':'13',
          'marks':'90',
          'name':'CCC',
          'date_accessed':'2017-07-12 17:43:24'
       },
       '002':{  
          'marks':'90',
          'class':'10',
          'name':'BBB',
          'date_accessed':'2017-07-12 17:43:24'
       },
       '001':{  
          'marks':'80',
          'class':'9',
          'name':'AAA',
          'date_accessed':'2017-07-12 17:43:24'
       },
       '005':{  
          'date_accessed':'2017-07-12 17:43:42',
          'marks':'999',
          'name':'EEE',
          'class':'99'
       },
       '004':{  
          'class':'50',
          'marks':'100',
          'name':'DDD',
          'date_accessed':'2017-07-12 17:43:24'
       }
    }
Run Code Online (Sandbox Code Playgroud)

现在我想对它进行排序marks,因此得到的字典将是这样的

    my_dict = { 
       '005':{  
          'date_accessed':'2017-07-12 17:43:42',
          'marks':'999',
          'name':'EEE',
          'class':'99'
       }, 
       '004':{  
          'class':'50',
          'marks':'100',
          'name':'DDD',
          'date_accessed':'2017-07-12 17:43:24'
       }
       '003':{  
          'class':'13',
          'marks':'90',
          'name':'CCC',
          'date_accessed':'2017-07-12 17:43:24'
       },
       '002':{  
          'marks':'90',
          'class':'10',
          'name':'BBB',
          'date_accessed':'2017-07-12 17:43:24'
       },
       '001':{  
          'marks':'80',
          'class':'9',
          'name':'AAA',
          'date_accessed':'2017-07-12 17:43:24'
       },
    }
Run Code Online (Sandbox Code Playgroud)

现在,不知怎的,我已经通过marks使用这个等式来实现它的排序

dict_sorted = sorted(my_dict, key=lambda x: int(my_dict[x]['marks']), reverse=True)
Run Code Online (Sandbox Code Playgroud)

但这只能keys以排序的方式给我,但我无法像上面那样生成新排序的字典.请帮我在这里marks按字典排序并给出新的排序字典.谢谢.

编辑:我已经在stackoverflow中看到了很多帖子,像这样按值排序Python字典,这个问题排序了一个在Python中具有非数字索引的多维字典,但是这些帖子无法提供我所需的结果.

Wil*_*sem 6

字典是无序的(包括).仅订购了几个版本的词典.正如文档中所写:

这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是dict 在将语言规范更改为之前,希望在几种版本的语言中使用这种新实现.授权所有当前和未来Python实现的顺序保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).

所以我们最好安全而不是抱歉,不要使用dict.

collections这里有一个OrderedDict类是一个字典,它按照添加方式维护元素的顺序.

因此我们现在可以使用它:

from collections import OrderedDict

OrderedDict(sorted(my_dict.items(),key=lambda x:int(x[1]['marks']),reverse=True))
Run Code Online (Sandbox Code Playgroud)

请注意,您必须使用.items()获取具有键值对的元组.然后,我们通过获取值(元组的第二个元素)并从该值对与'marks'键相关联的值进行排序.

如果你想要数字比较,你应该添加一个int(..)调用,首先将它们转换为整数.

这会产生:

>>> OrderedDict(sorted(my_dict.items(),key=lambda x:int(x[1]['marks']),reverse=True))
OrderedDict([('005', {'name': 'EEE', 'date_accessed': '2017-07-12 17:43:42', 'class': '99', 'marks': '999'}), ('004', {'name': 'DDD', 'date_accessed': '2017-07-12 17:43:24', 'class': '50', 'marks': '100'}), ('003', {'name': 'CCC', 'date_accessed': '2017-07-12 17:43:24', 'class': '13', 'marks': '90'}), ('002', {'name': 'BBB', 'date_accessed': '2017-07-12 17:43:24', 'class': '10', 'marks': '90'}), ('001', {'name': 'AAA', 'date_accessed': '2017-07-12 17:43:24', 'class': '9', 'marks': '80'})])
Run Code Online (Sandbox Code Playgroud)

An OrderedDict是Python中vanilla字典子类.因此,所有受支持的操作也受dict支持OrderedDict.