【问题标题】:How to sort multi-level dictionary by it's value?如何按值对多级字典进行排序?
【发布时间】:2017-07-03 23:54:01
【问题描述】:

如何按值对python多级字典进行排序?

test_dict = {'Items1':{'name':'Homer', 'age':39},'Items2':{'name':'Bart', 'age':10},'Items3':{'name':'Json','age':20}}

按 'age' 排序后,应该是

test_dict = {'Items2':{'name':'Bart', 'age':10},'Items3':{'name':'Json','age':20},'Items1':{'name':'Homer', 'age':39}}

对于给您带来的不便,我深表歉意。更正了问题。

【问题讨论】:

  • 等等,这不是有效的语法:你的意思是 Items 包含一个列表吗?
  • 字典默认不排序,如需排序请使用OrderedDict
  • 如果您在谈论collections.OrderedDict,请明确输入。
  • @All:给您带来的不便,我深表歉意。更正了问题。

标签: python dictionary ordereddictionary


【解决方案1】:

您可以使用默认库和sorted() 方法这样做:

from collections import OrderedDict

test_dict = {
    'Items1':{'name':'Homer', 'age':39},
    'Items2':{'name':'Bart', 'age':10},
    'Items3':{'name':'Json','age':20}
}

sorted_dict = OrderedDict()
sorted_keys = sorted(test_dict, key=lambda x: test_dict[x]["age"])     

for key in sorted_keys: 
    sorted_dict[key] = test_dict[key]

print(sorted_dict)

输出:

OrderedDict([('Items2', {'age': 10, 'name': 'Bart'}), ('Items3', {'age': 20, 'name': 'Json'}), ('Items1', {'age': 39, 'name': 'Homer'})])

【讨论】:

  • 看起来很简单 :) ,没有使用任何外部库。使用熊猫肯定有一些区别!!!,但不确定。当您打印 sorted_dict 时,它会打印为 OrderedDict !!!为什么 ?我的怀疑可能听起来很傻,但我对 python 很陌生。
  • 正如其他答案和 cmets 所提到的,如果您需要 dict 作为输出,那么您必须使用 OrderedDict,因为普通的 dict 不会保留您设置的顺序。有序 dict 的行为与普通 dict 一样,但会保持其键和值的顺序。
【解决方案2】:

首先,请注意,常规的 Python 字典是无序的。订购字典需要使用OrderedDict

要回答您的问题,您可以使用对处理数据非常有用的 pandas 库,将您的项目加载到 pandas,对其进行排序,然后导出回有序字典

import pandas as pd
df = pd.DataFrame(test_dict)
result = df.sort_values(by='age', axis=1, ascending=True).apply(OrderedDict)

结果

Items2     {u'age': 10, u'name': u'Bart'}
Items3     {u'age': 20, u'name': u'Json'}
Items1    {u'age': 39, u'name': u'Homer'}

【讨论】:

  • 这里不需要熊猫。您可以简单地使用 sorted : test_dict['Items'] = sorted(test_dict['Items'], key=lambda x:x['age'])
  • @user2476373:对于给您带来的不便,我深表歉意。更正了问题。
  • @GuillaumeA.:对于给您带来的不便,我深表歉意。更正了问题。
  • @Jackie,我在您更正后更新了答案
  • 我同意@user2476373,但是在某些情况下,如果您无法访问外部库,最好知道如何使用sorted(),尤其是key 参数。跨度>
猜你喜欢
  • 2016-03-14
  • 2010-10-11
相关资源
最近更新 更多