Python3:dict按第三级值对第二级排序

Python3:dict按第三级值对第二级排序,python,sorting,dictionary,nested,Python,Sorting,Dictionary,Nested,我已经为这个问题奋斗了好几个小时。我有下面的简体格言 dico = { "posts": { "k1": {"val": 2}, "k2": {"val": 1}, "k3": {"val": 3}, "k4": {"val": 0},

我已经为这个问题奋斗了好几个小时。我有下面的简体格言

dico = {
    "posts": {
        "k1": {"val": 2},
        "k2": {"val": 1},
        "k3": {"val": 3},
        "k4": {"val": 0},
        }
}
我希望在第二个键级别(k1,k2…)通过第三个级别“val”键的值进行排序。 我需要的结果如下:

dico = {
    "posts": {
        "k4": {"val": 0},
        "k2": {"val": 1},
        "k1": {"val": 2},
        "k3": {"val": 3},
        }
}
有没有办法通过排序的
实现这一点?
除了排序(dico['posts'],key=lambda x:dico['posts'][x]['val'])之外,我无法实现更进一步的功能。
其中给出:

['k4', 'k2', 'k1', 'k3']

无限感谢您的帮助

假设使用CPython>=3.7

sorted
只能返回一个列表,因此如果您希望仍然能够访问内部dict(以便以排序方式重新分配它们),则需要对dico['posted'].items()进行排序,否则它将只对键进行排序

dico['posts'] = dict(sorted(dico['posts'].items(), key=lambda x: x[1]['val']))
现在,由于我们对dico['posts'].items()进行排序,
sorted
返回一个已排序的元组列表(尝试打印它),所以我们只需将其转换回
dict
,并重新分配

dico = {
    "posts": {
        "k1": {"val": 2},
        "k2": {"val": 1},
        "k3": {"val": 3},
        "k4": {"val": 0},
        }
}

dico['posts'] = dict(sorted(dico['posts'].items(), key=lambda x: x[1]['val']))
print(dico)
输出

{
    "posts": {
        "k4": {"val": 0},
        "k2": {"val": 1},
        "k1": {"val": 2},
        "k3": {"val": 3},
    }
}

基本类型
dict
未按定义排序。如果你想要一个排序的dict,你必须切换到一个支持顺序的派生词,比如collections.DefaultDict。@Prune Python 3.7的dict保持它们的插入顺序,我认为它已经过时了足够长的时间,所以我们可以假设OP正在使用它或newerAh——我这周接触了太多的2.7篇文章。很好的观点——是的,dicts现在保留了它们的顺序。在本例中,我想知道OP在哪里被卡住了——排序顺序被正确地确定了,现在它只是插入。我忘了提到,我使用的是3.7。3@Prunecollections.DefaultDict不存在。Briliant,它工作完美,非常感谢!