对字典中的字典进行排序

6

我有一个字典的字典,大概长这样:

"abc": {
    "name": "Joey",
    "order": 3
    },
"def": {
    "name": "Allen",
    "order": 2
    },
"ghi": {
    "name": "Tim",
    "order": 1
    }

现在,我想按照“order”值对该字典进行排序。
也就是说,排序后的字典将如下所示:
"ghi": {
    "name": "Tim",
    "order": 1
    }
"def": {
    "name": "Allen",
    "order": 2
    },
"abc": {
    "name": "Joey",
    "order": 3
    }

我该怎么做呢? 我找到了对列表中的字典进行排序的方法,但是没有对于字典中的字典。


2
你不能在不使用OrderedDict或将其转换为列表的情况下对字典进行排序。 - A.J. Uppal
3
一个 dict 总是无序的。 - ZdaR
Python:对列表字典进行排序 中的答案可以轻松地适用于字典中的字典。 - glibdud
5个回答

7
使用sorted按“order”排序,并使用collections.OrderedDict存储结果。
import collections

d = {
    "abc": {
        "name": "Joey",
        "order": 3
        },
    "def": {
        "name": "Allen",
        "order": 2
        },
    "ghi": {
        "name": "Tim",
        "order": 1
        }
    }

result = collections.OrderedDict(sorted(d.items(), key=lambda t:t[1]["order"]))

# Output
print(result)
OrderedDict([('ghi', {'name': 'Tim', 'order': 1}), 
            ('def', {'name': 'Allen', 'order': 2}), 
            ('abc', {'name': 'Joey', 'order': 3})])

这也可以打印出'ghi', {'order': 1, 'name': 'Tim'},但这可能与问题相关或不相关。 - Spherical Cowboy
我该如何按多列排序,例如先按'order'降序排列,然后再按'name'排序? - Alex Stewart

3

不确定您想要实现什么。如果您想要完成以下操作,而不使用OrderedDict:

dct_of_dcts = {
    "abc":
        {
            "name": "Joey",
            "order": 3
        },
    "def":
        {
            "name": "Allen",
            "order": 2
        },
    "ghi":
        {
            "name": "Tim",
            "order": 1
        }}

for k, v in sorted(dct_of_dcts.items(), key=lambda e: e[1]["order"]):
    print(k, v)

将打印以下内容之一:

ghi {'name': 'Tim', 'order': 1}
def {'name': 'Allen', 'order': 2}
abc {'name': 'Joey', 'order': 3}

或者:

ghi {'order': 1, 'name': 'Tim'}
def {'order': 2, 'name': 'Allen'}
abc {'order': 3, 'name': 'Joey'}

如果你只是想按照你指定的顺序输出/打印字典中的嵌套字典,可以使用以下方法:

for k, v in sorted(dct_of_dcts.items(), key=lambda e: e[1]["order"]):
    print(k, sorted(v.items()))

输出:

ghi [('name', 'Tim'), ('order', 1)]
def [('name', 'Allen'), ('order', 2)]
abc [('name', 'Joey'), ('order', 3)]

1
from _collections import OrderedDict
d = {"abc":{"name":"Joey","order":3},
     "def":{"name":"Allen","order":2},
     "ghi":{"name":"Tim","order":1}}
_sorted = OrderedDict(sorted(d.items(), key=lambda x: x[1]["order"]))

然后:

print(_sorted)
OrderedDict([('ghi', {'order': 1, 'name': 'Tim'}), ('def', {'order': 2, 'name': 'Allen'}), ('abc', {'order': 3, 'name': 'Joey'})])

And:
print(_sorted["ghi"])
{'order': 1, 'name': 'Tim'}

字典是无序的,如果你想要一个有序的字典,你需要使用OrderedDict


1
你可以使用OrderedDict。
from collections import OrderedDict

dic = { 'abc': { 'name': 'Joey', 'order': 3 }, 'def': { 'name': 'Allen', 'order': 2 }, 'ghi': { 'name': 'Tim', 'order': 1 } }

order_dic = OrderedDict(sorted(dic.items(), key=lambda x: x[1]['order'], reverse=False))

0
一个字典不像一个列表-它没有特定的“顺序”。它只是一组键和它们各自的值,因此无法对字典进行排序。
如果您想了解更多信息,文档 提供了有关该数据类型的良好概述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接