【问题标题】:Python: Efficient way of sorting dictionary that has n dictionaries within itPython:对其中包含 n 个字典的字典进行排序的有效方法
【发布时间】:2019-07-21 19:27:33
【问题描述】:

我直接上例子:

这里我们有一个带有测试名称的字典,以及另一个包含级别分类的字典。

编辑

       Input: 

      test_values={  
   {  
      "name":"test1",
      "level_map":{  
         "system":1,
         "system_apps":2,
         "app_test":3
      }
   },
   {  
      "name":"test2",
      "level_map":{  
         "system":1,
         "system_apps":2,
         "app_test":3
      }
   },
   {  
      "name":"test3",
      "level_map":{  
         "system":1,
         "memory":2,
         "memory_test":3
      }
   }
}


Output:

What I want is this:

dict_obj:

{  
   "system":{  
      "system_apps":{  
         "app_test":{  
            test1 object,
            test2 object
         },
         "memory":{  
            "memory_test":{  
               test3 object
            }
         }
      }
   }

我只是无法理解逻辑,我什至都在努力想出一个方法。如果有人可以指导我,那就太好了。

【问题讨论】:

  • 很抱歉。编辑了我的帖子。
  • 是的,它是一个字典列表。我打算遍历输入的每个项目,构造输出对象并将该项目附加为值。但是,我完全迷失了方向,并且想了好几个小时却没有任何进展。
  • @DeveshKumarSingh 感谢您的帮助,但 jferard 完美地回答了它。我的尝试与他的解决方案几乎完全相同,但是,我错过了先对级别进行排序以创建列表,然后使用它们来构建树的想法。

标签: python data-structures


【解决方案1】:

让我们从 level_map 开始。您可以对值的键进行排序以获得有序的级别:

>>> level_map = { "system": 1, "system_apps": 2, "app_test": 3}
>>> L = sorted(level_map.keys(), key=lambda k: level_map[k])
>>> L
['system', 'system_apps', 'app_test']

使用这些元素构建一棵

>>> root = {}
>>> temp = root
>>> for k in L[:-1]:
...     temp = temp.setdefault(k, {}) # create new inner dict if necessary
...
>>> temp.setdefault(L[-1], []).append("test") # and add a name
>>> root
{'system': {'system_apps': {'app_test': ['test']}}}

我在最后一个元素之前拆分列表,因为最后一个元素将关联到一个列表,而不是一个字典(树的叶子在您的示例中是列表)。

现在,很容易用字典列表重复这个:

ds = [{ "name": "test1",
      "level_map": { "system": 1, "system_apps": 2, "app_test": 3}
    }, { "name": "test2",
     "level_map": { "system": 1, "system_apps": 2, "app_test": 3}
    }, { "name": "test3",
     "level_map": { "system": 1, "memory": 2, "memory_test": 3}
    }]


root = {}
for d in ds:
    name = d["name"]
    level_map = d["level_map"]
    L = sorted(level_map.keys(), key=lambda k: level_map[k])
    temp = root
    for k in L[:-1]:
        temp = temp.setdefault(k, {})
    temp.setdefault(L[-1], []).append(name)

# root is: {'system': {'system_apps': {'app_test': ['test1', 'test2']}, 'memory': {'memory_test': ['test3']}}}

【讨论】:

  • 这是完美的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多