将包含 parents 的 objects 字典转换为包含 children 的嵌套字典

Convert dictionary of objects with parents to a nested dictionary with children

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

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

parents 列表以相反的顺序 给定实体的所有 parents 。这意味着对于 589342,层次结构如下:1(我的树的根)包含 131567,包含 2759,包含 3027 , 本身包含 589342.

我需要的输出是所有实体及其 children 的列表或字典(不像我目前拥有的 parents),并且会理想情况下看起来像(让我们暂时忽略 contentname 字段):

{'id': '1', 'children':[{
    'id':'131567', 'children':[
            {'id':'2759', 'children':[...]}, 
            {'id':'2', 'children':[...]}
        ]
    }, 
    ...
    ]
}

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

首先,将您的 data_dict 转换为 "anchestors" 的列表:

parents = [[k] + v["parents"] for k, v in data_dict.items()]

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

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()]