【问题标题】:Python3 : dict sort 2nd level by 3rd level valuesPython3:字典按第三级值排序第二级
【发布时间】:2021-06-30 19:33:33
【问题描述】:

我已经为这个问题奋斗了好几个小时。我有以下简化的字典

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

我想按第三级“val”键的值在第二级键(k1,k2...)进行排序。 我需要的结果如下:

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

有没有办法用 sorted 做到这一点? 我无法做到比sorted(dico['posts'], key=lambda x: dico['posts'][x]['val']) 更进一步:

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

提前无限感谢您的帮助!!

【问题讨论】:

  • 基本类型dict 未排序,根据定义。如果你想要一个排序的字典,你必须切换到支持顺序的衍生物之一,例如 collections.DefaultDict.
  • @Prune Python 3.7 的 dicts 保持它们的插入顺序,我认为它现在已经出现了足够长的时间,所以我们可以假设 OP 正在使用它或更新的版本
  • 啊——这周我遇到了太多 2.7 个帖子。好点——是的,dicts 现在保留了它们的顺序。在这种情况下,我想知道 OP 卡在哪里了——排序顺序已正确确定,现在它只是插入。
  • 我忘了说,我用的是3.7.3
  • @Prune collections.DefaultDict 不存在。

标签: python sorting dictionary nested


【解决方案1】:

假设使用 CPython >= 3.7

sorted 只能返回一个列表,因此如果您希望仍然能够访问内部字典(以便以排序方式重新分配它们),您需要对 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},
    }
}

【讨论】:

  • 太棒了,完美无瑕,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2023-01-07
  • 2018-06-04
  • 1970-01-01
  • 2021-12-08
  • 2021-06-18
相关资源
最近更新 更多