Python 从平面字典创建嵌套字典
我有下面的字典,其中Python 从平面字典创建嵌套字典,python,python-2.7,dictionary,nested,Python,Python 2.7,Dictionary,Nested,我有下面的字典,其中键是父类,值是从它们继承的子类列表 { "Animal": ["Dog"] , "Dog": ["Labrador"] , "Vehicle": ["PetrolCar", "DieselCar"] , "DieselCar": ["Hyundai"] , "PetrolCar": ["Hy
键
是父类,值
是从它们继承的子类列表
{
"Animal":
["Dog"]
,
"Dog":
["Labrador"]
,
"Vehicle":
["PetrolCar",
"DieselCar"]
,
"DieselCar":
["Hyundai"]
,
"PetrolCar":
["Hyundai",
"Ford"]
}
如您所见,一些父类也是另一个父类(深度继承)的子类,即Animal->Dog->Labrador
如何设置格式,使输出表示继承级别,如:
{
"Animal": {
"Dog": {
"Labrador": []
}
},
"Vehicle": {
"PetrolCar": {
"Hyundai": [],
"Ford": []
},
"DieselCar": {
"Hyundai": []
}
}
}
我还希望能够通过添加更多的父级或子级来扩展提供的数据集。例如:将
电动车
添加为车辆
的子项,并将特斯拉
添加为电动车
的子项。并添加猫作为动物的孩子,没有自己的孩子
输入:
{
"Animal":
["Dog",
"Cat"]
,
"Dog":
["Labrador"]
,
"Vehicle":
["PetrolCar",
"DieselCar",
"ElectricCar"]
,
"DieselCar":
["Hyundai"]
,
"PetrolCar":
["Hyundai",
"Ford"]
,
"ElectricCar":
["Tesla"]
}
输出:
{
"Animal": {
"Dog": {
"Labrador": []
},
"Cat": []
},
"Vehicle": {
"PetrolCar": {
"Hyundai": [],
"Ford": []
},
"DieselCar": {
"Hyundai": []
},
"ElectricCar": {
"Tesla": []
}
}
}
{
"Animal": {
"Dog": {
"Labrador": []
},
"Cat": []
},
"Vehicle": {
"PetrolCar": {
"Hyundai": [],
"Ford": []
},
"DieselCar": {
"Hyundai": []
},
"ElectricCar": {
"Tesla": []
}
}
}
可以使用递归生成嵌套字典,然后删除没有任何子项的键:
data = {'Animal': ['Dog', 'Cat'], 'Dog': ['Labrador'], 'Vehicle': ['PetrolCar', 'DieselCar', 'ElectricCar'], 'DieselCar': ['Hyundai'], 'PetrolCar': ['Hyundai', 'Ford'], 'ElectricCar': ['Tesla']}
def build(key):
return {i:[] if i not in data else build(i) for i in data[key]}
results = {i:build(i) for i in data}
输出:
{
"Animal": {
"Dog": {
"Labrador": []
},
"Cat": []
},
"Vehicle": {
"PetrolCar": {
"Hyundai": [],
"Ford": []
},
"DieselCar": {
"Hyundai": []
},
"ElectricCar": {
"Tesla": []
}
}
}
{
"Animal": {
"Dog": {
"Labrador": []
},
"Cat": []
},
"Vehicle": {
"PetrolCar": {
"Hyundai": [],
"Ford": []
},
"DieselCar": {
"Hyundai": []
},
"ElectricCar": {
"Tesla": []
}
}
}
你可以从你最初的字典中建立一个图表,然后在孩子们中间建立一个最终的字典谢谢!你能再解释一下这是怎么回事吗?它适用于提供的示例,但在我添加
车辆的另一个子项时失败,因此我想调整您的代码,使其适用于提供的任何子项dataset@Gary您能否将数据与车辆的附加子项
一起发布,以及所需的输出?当前,如果原始数据中不存在子值,则它是list的一个元素,并且list是父键的值。但是,如果一个键的某些值存在于数据中,而另一些值不存在,那么该如何表示呢?@Gary,谢谢。“电动汽车”
未包含在最终输出中的原因是“电动汽车”
未出现在“车辆”
的子项中,因此在构建中的循环中无法访问它。但是,如果将“ElectricCar”
添加到“Vehicle”
下的列表中,则会产生所需的输出。请查看我最近的编辑,因为我发布了此结果。是的,很抱歉您的原始代码按预期工作。还有一个问题——我如何使树的所有元素都有一个子元素列表,如果子元素没有任何子元素,该列表可以为空?我会将此添加到原始帖子中。@Gary也进行了更新,以反映添加的Cat