【问题标题】:Sorting list of nested dictionaries in python 3python 3中嵌套字典的排序列表
【发布时间】:2018-03-17 19:22:14
【问题描述】:

我正在尝试对包含字典的字典进行排序。这是那本字典:

mydict = {
  'b': {'play': 2, 'scratch': 5, 'face': 8},
  'c': {'do': 4, 'chew': 6},
  'a': {'wash': 1, 'drink': 10, 'give': 20, 'eat': 30}
}

我想要排序后的结果如下:

{
  'a': {'eat': 30, 'give': 20, 'drink': 10, 'wash': 1},
  'b': {'face': 8, 'scratch': 5, 'play': 2},
  'c': {'chew': 6, 'do': 4}
}

如果你能告诉我如何解决这个问题,我将不胜感激。

【问题讨论】:

  • 字典是无序的。

标签: python sorting dictionary nested


【解决方案1】:

创建有序版本的 mydict

让我们从你的字典开始:

>>> mydict = {
...   'b': {'play': 2, 'scratch': 5, 'face': 8},
...   'c': {'do': 4, 'chew': 6},
...   'a': {'wash': 1, 'drink': 10, 'give': 20, 'eat': 30}
... }

普通字典是无序的。有序字典,但是可以从集合模块中获得:

>>> from collections import OrderedDict

我们可以将您的字典转换为有序字典,如下所示:

>>> d = OrderedDict(sorted(mydict.items()))
>>> d
OrderedDict([('a', {'give': 20, 'drink': 10, 'eat': 30, 'wash': 1}), ('b', {'scratch': 5, 'play': 2, 'face': 8}), ('c', {'do': 4, 'chew': 6})])

正如您在上面看到的,d 是按我们想要的顺序排列的。或者,我们可以只查看密钥并验证它们是否符合我们想要的顺序:

>>> d.keys()
odict_keys(['a', 'b', 'c'])

在其他方面,我们的有序字典 d 的行为就像一个普通字典:

>>> d['a']
{'give': 20, 'drink': 10, 'eat': 30, 'wash': 1}

按键排序mydict,同时按值降序排列其中的字典

如果我们希望 mydict 中的字典按值的降序排序,我们再次使用 OrderedDict:

>>> mydict['a']
{'give': 20, 'drink': 10, 'eat': 30, 'wash': 1}
>>> OrderedDict(sorted(mydict['a'].items(), key=lambda v: -v[-1]))
OrderedDict([('eat', 30), ('give', 20), ('drink', 10), ('wash', 1)])

如果我们想将此排序应用于 mydict 的所有条目:

>>> d = OrderedDict( sorted( (key1, OrderedDict(sorted(value.items(), key=lambda v: -v[-1]))) for (key1, value) in mydict.items()) )
>>> d
OrderedDict([('a', OrderedDict([('eat', 30), ('give', 20), ('drink', 10), ('wash', 1)])), ('b', OrderedDict([('face', 8), ('scratch', 5), ('play', 2)])), ('c', OrderedDict([('chew', 6), ('do', 4)]))])

【讨论】:

  • 非常感谢您的评论。我试过你告诉我的。我想要得到的结果是“{'eat': 30, 'give': 20, 'drink': 10, 'wash': 1}”。结果按“值”排序,而不是键。如果您知道如何管理,我会很高兴。
  • @RyoheiDeIwata 好的。我想我明白了您想要什么:我在答案的末尾添加了一个部分,以显示如何按值按降序对内部字典进行排序,而 mydict 仍按键按键的升序排序。
  • 非常感谢!因为你,我成功了!
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 2019-05-08
  • 2021-07-27
  • 1970-01-01
  • 2019-02-04
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多