下面是我的示例词典。
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 value和Issue sorting a multi-dimensional dictionary that has non-numeric indices in Python,但这些帖子无法提供我所需的结果。
答案 0 :(得分:6)
词典无序最多(包括)python-3.5。仅订购了python-3.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