Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将包含父对象的对象字典转换为包含子对象的嵌套字典_Python_Dictionary_Nested_Hierarchy - Fatal编程技术网

Python 将包含父对象的对象字典转换为包含子对象的嵌套字典

Python 将包含父对象的对象字典转换为包含子对象的嵌套字典,python,dictionary,nested,hierarchy,Python,Dictionary,Nested,Hierarchy,我有一个具有父子关系的实体字典,是在解析文件中每个实体的父实体后获得的。 我最终得到了一个具有以下结构的字典,其中每个元素都有其所有父元素的完整列表。示例字典: data_dict = { '1388004': {'content': '13', 'parents': ['1280', '1279', '90964', '1385', '91061', '1239', '1783272', '2', '131567', '1'],

我有一个具有父子关系的实体字典,是在解析文件中每个实体的父实体后获得的。 我最终得到了一个具有以下结构的字典,其中每个元素都有其所有父元素的完整列表。示例字典:

data_dict = {
    '1388004': {'content': '13', 
                'parents': ['1280', '1279', '90964', '1385', '91061', '1239', '1783272', '2', '131567', '1'], 
                'name': 'foo'}, 
    '1895753': {'content': '11', 
                'parents': ['46913', '45401', '356', '28211', '1224', '2', '131567', '1'], 
                'name': 'bar'}, 
    '642227': {'content': '11', 
               'parents': ['82986', '1903409', '91347', '1236', '1224', '2', '131567', '1'], 
               'name': 'baz'}, 
    '89373': {'content': '27', 
               'parents': ['768507', '768503', '976', '68336', '1783270', '2', '131567', '1'], 
               'name': 'zab'}, 
    '81406': {'content': '21', 
               'parents': ['872', '194924', '213115', '28221', '68525', '1224', '2', '131567', '1'], 
               'name': 'oof'}, 
    '796027': {'content': '12', 
               'parents': ['410829', '410830', '4892', '4891', '147537', '716545', '4890', '451864', '4751', '33154', '2759', '131567', '1'], 
               'name': 'ofo'}, 
    '589342': {'content': '16', 
               'parents': ['3027', '2759', '131567', '1'], 
               'name': 'raz'}
    }
父项
列表以相反顺序表示给定实体的所有父项。这意味着对于
589342
,层次结构如下:
1
(我树的根)包含
131567
,它包含
2759
,它包含
3027
,它本身包含
589342

我需要的输出是所有实体及其子实体的列表或dict(而不是像我现在这样的父实体),理想情况下应该是这样的(现在我们忽略
内容
名称
字段):


欢迎任何关于如何实现这一目标的想法!如果你需要更多的信息,请告诉我

首先,将您的
数据\u dict
转换为“存储”列表:

然后,您可以按相反顺序迭代这些列表,并相应地向dict添加新条目:

root = {}
for hierarchy in parents:
    current = root
    for node in reversed(hierarchy):
        current = current.setdefault(node, {})
结果格式有点不同

{'1': {'131567': {'2': {'1224': {'1236': {'91347': {'1903409': {'82986': {'642227': {}}}}},
                                 '28211': {'356': {'45401': {'46913': {'1895753': {}}}}},
                                 '68525': {'28221': {'213115': {'194924': {'872': {'81406': {}}}}}}},
                        '1783270': {'68336': {'976': {'768503': {'768507': {'89373': {}}}}}},
                        '1783272': {'1239': {'91061': {'1385': {'90964': {'1279': {'1280': {'1388004': {}}}}}}}}},
                  '2759': {'3027': {'589342': {}},
                           '33154': {'4751': {'451864': {'4890': {'716545': {'147537': {'4891': {'4892': {'410830': {'410829': {'796027': {}}}}}}}}}}}}}}}
。。。但之后应易于翻译,例如:

def translate(d):
    return [{"id": k, "children": translate(v)} for k, v in d.items()]

否,
parents
列表是所有父对象(对象的父对象及其父对象,直到达到rot)的列表。对不起,如果我的解释不清楚。是否保证父母是正确的?是否有可能一个父列表是
[a,b,c]
,而另一个是
[a,d,c]
?是的,总是只有一条可能的路径可以到达一个对象。其他属性如
content
raz
并不重要?现在可以忽略它们!令人惊叹的!我也喜欢威廉的解决方案,但似乎他删除了它。。。谢谢
{'1': {'131567': {'2': {'1224': {'1236': {'91347': {'1903409': {'82986': {'642227': {}}}}},
                                 '28211': {'356': {'45401': {'46913': {'1895753': {}}}}},
                                 '68525': {'28221': {'213115': {'194924': {'872': {'81406': {}}}}}}},
                        '1783270': {'68336': {'976': {'768503': {'768507': {'89373': {}}}}}},
                        '1783272': {'1239': {'91061': {'1385': {'90964': {'1279': {'1280': {'1388004': {}}}}}}}}},
                  '2759': {'3027': {'589342': {}},
                           '33154': {'4751': {'451864': {'4890': {'716545': {'147537': {'4891': {'4892': {'410830': {'410829': {'796027': {}}}}}}}}}}}}}}}
def translate(d):
    return [{"id": k, "children": translate(v)} for k, v in d.items()]