将包含 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),并且会理想情况下看起来像(让我们暂时忽略 content
和 name
字段):
{'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()]
我有一个具有 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),并且会理想情况下看起来像(让我们暂时忽略 content
和 name
字段):
{'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()]