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