【问题标题】:Sorting a dictionary of Dictionaries - Python对字典进行排序 - Python
【发布时间】:2017-07-12 21:48:40
【问题描述】:

我正在用 Python 编写一个脚本 - 我有一本字典,看起来像这样:

"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
    }

谁能帮我解决这个问题? 我找到了对字典列表进行排序的方法,但不是字典的字典......

非常感谢您的帮助,谢谢!

【问题讨论】:

  • 如果不使用OrderedDict 或转换为列表,您将无法对字典进行排序。
  • A dict 始终未排序。
  • Python: sorting a dictionary of lists 中的答案可以很容易地适应字典的字典。

标签: python sorting dictionary


【解决方案1】:

不确定您想要完成的究竟是什么。如果您想按照以下方式做一些事情,那么不要使用 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)]

【讨论】:

    【解决方案2】:

    你可以使用 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))
    

    【讨论】:

      【解决方案3】:
      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'})])
      

      还有:

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

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

      【讨论】:

        【解决方案4】:

        使用sorted按“顺序”排序,使用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'},但可能相关也可能不相关。
        • 如何按多列排序,即“顺序”降序然后“名称”?
        【解决方案5】:

        字典不像列表——它没有特定的“顺序”。它只是键及其各自值的集合,因此无法对字典进行排序。

        如果您想了解更多关于它的信息,docs 可以很好地概述数据类型。

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 2014-05-26
          相关资源
          最近更新 更多