Python:对字典进行排序的有效方法,其中包含n个字典
我将直接进入示例: 这里我们有一个带有测试名称的字典和另一个包含级别分类的dict 编辑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",
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完美地回答了这个问题。我的尝试与他的解决方案几乎完全相同,但是,我没有想到先对级别进行排序以创建一个列表,然后使用它们来构建一棵树。这太完美了。非常感谢。这太完美了。非常感谢你。