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

时间:2017-07-12 16:58:36

标签: python python-2.7 sorting dictionary

下面是我的示例词典。

    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'
       }
    }

现在我想按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'
       },
    }

现在,不知何故,我已经实现了使用此等式<{1}}按marks对其进行排序

dict_sorted = sorted(my_dict, key=lambda x: int(my_dict[x]['marks']), reverse=True)

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

编辑:我已经在stackoverflow中看到过很多帖子,例如Sort a Python dictionary by valueIssue sorting a multi-dimensional dictionary that has non-numeric indices in Python,但这些帖子无法提供我所需的结果。

3 个答案:

答案 0 :(得分:6)

词典无序最多(包括)。仅订购了个词典的少数版本。正如documentation

中所写
  

考虑了这个新实现的顺序保留方面   一个实施细节,不应该依赖(这可能   将来改变,但希望有这个新的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))

请注意,您必须使用.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'})])

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

答案 1 :(得分:0)

在python中,据我所知,你不能真正对字典进行排序,我将使用以下代码:

def sort_dict_to_top_whatever(dict_to_sort, how_many_to_store):
    """
    function will sort the input dict and return the amount of the input number as top
    :param dict_to_sort: the dict with numbers at the values
    :param how_many_to_store: how much to take
    :return: the sorted dict
    """
    #                    -x: because we need to reverse sort:
    step1_sort_to_list = sorted(list(dict_to_sort.items()), key = lambda x: -int(x[1]["marks"]))
    step2_take_top = step1_sort_to_list[:how_many_to_store]
    step3_the_dict = {info[FIRST]: info[1] for info in step2_take_top}
    return step3_the_dict

然后:

sorted_dict = sort_dict_to_top_whatever(my_dict, len(my_dict))

答案 2 :(得分:0)

使用您必须获得的行来获得想要字典的正确索引顺序

dict_sorted = sorted(my_dict, key=lambda x: int(my_dict[x]['marks']), reverse=True)

然后使用新的索引顺序遍历字典,并添加到新字典中

newly_ordered = {}
for new_index in dict_sorted:
    # get the relevant item from the original dictionary
    item = file_list[new_index]
    print(item)
    # add to new dict
    newley_ordered = item