Python:对字典进行排序的有效方法,其中包含n个字典

Python:对字典进行排序的有效方法,其中包含n个字典,python,data-structures,Python,Data Structures,我将直接进入示例: 这里我们有一个带有测试名称的字典和另一个包含级别分类的dict 编辑 Input: test_values={ { "name":"test1", "level_map":{ "system":1, "system_apps":2, "app_test":3 } }, { "name":"test2",

我将直接进入示例:

这里我们有一个带有测试名称的字典和另一个包含级别分类的dict

编辑

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

我就是无法理解这个逻辑,我甚至很难想出一个方法。如果有人能指引我,那就太好了。

让我们从关卡地图开始。您可以对值上的键进行排序,以获得有序的级别:

>>> 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']
使用以下元素构建树:

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

现在,我们可以很容易地重复这一点:

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']}}}

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

>>> 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']
使用以下元素构建树:

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

现在,我们可以很容易地重复这一点:

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']}}}

很抱歉。编辑了我的帖子。是的,这是一个目录。我将遍历输入的每个项,构造输出对象,并将该项作为值附加。然而,我完全迷路了,想了几个小时都没有任何进展。@DeveshKumarSingh谢谢你的帮助,但是jferard完美地回答了这个问题。我的尝试与他的解决方案几乎完全相同,但是,我没有想到先对级别进行排序以创建一个列表,然后使用它们来构建一棵树。对此我深表歉意。编辑了我的帖子。是的,这是一个目录。我将遍历输入的每个项,构造输出对象,并将该项作为值附加。然而,我完全迷路了,想了几个小时都没有任何进展。@DeveshKumarSingh谢谢你的帮助,但是jferard完美地回答了这个问题。我的尝试与他的解决方案几乎完全相同,但是,我没有想到先对级别进行排序以创建一个列表,然后使用它们来构建一棵树。这太完美了。非常感谢。这太完美了。非常感谢你。