gpt4 book ai didi

python - 如何从有序邻接表构建递归字典树

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:25:40 25 4
gpt4 key购买 nike

我一整天都在想办法解决这个问题,但我已经束手无策了。也许我只是为此变老了。

我正在尝试按照指定的方式在 django-treebeard 上为 load_bulk 功能构建一棵树 here

为了省事,它应该是这样的:

data = [{'data':{'desc':'1'}},
{'data':{'desc':'2'}, 'children':[
{'data':{'desc':'21'}},
{'data':{'desc':'22'}},
{'data':{'desc':'23'}, 'children':[
{'data':{'desc':'231'}},
]},
{'data':{'desc':'24'}},
]},
{'data':{'desc':'3'}},
{'data':{'desc':'4'}, 'children':[
{'data':{'desc':'41'}},
]},
]

'data' 保存记录,如果它有子项,'children' 是更多'data' 字典的列表(也可以包含子项列表等递归)

我将数据作为有序列表获取(按深度优先排序,而不是按 ID):

例如:

[
{'id': 232, 'name': 'jon', 'parent': 'None'}
{'id': 3522, 'name': 'dave', 'parent': '232'}
{'id': 2277, 'name': 'alice', 'parent': '3522'}
{'id': 119, 'name': 'gary', 'parent': '232'}
{'id': 888, 'name': 'gunthe', 'parent': '119'}
{'id': 750, 'name': 'beavis', 'parent': 'None'}
{'id': 555, 'name': 'urte', 'parent': '750'}
]

我怎样才能将它转换成一个 treebeard 兼容的字典,看起来像这样(拼写错误除外):

[
{'data': {'id': 232, 'name': 'jon', 'parent': 'None'},
'children': [
{'data': {'id': 3522, 'name': 'dave', 'parent': '232'},
'children': [
{'data': {'id': 2277, 'name': 'alice', 'parent': '3522'}}
]
}
{'data': {'id': 119, 'name': 'gary', 'parent': '232'},
'children': [
{'id': 888, 'name': 'gunthe', 'parent': '119'}
]
}
]
{'data': {'id': 750, 'name': 'beavis', 'parent': 'None'},
'children': [
{'id': 555, 'name': 'urte', 'parent': '750'}
]
}

]

我想我需要某种递归函数,因为它是一种递归结构,但我所有的尝试都失败了。我的大脑不太擅长递归。

我进行了大量搜索,发现大部分解决方案与列表或其他我无法调整的结构有关。我是一个相对的菜鸟。 ps 手动输入示例比我在剩下的时间(晚餐时间除外)更有趣。

最佳答案

也许有更好的方法,但这里有一个解决方案:

users = [
{
'id': 232,
'name': 'jon',
'parent': None
},
{
'id': 3522,
'name': 'dave',
'parent': 232
},
{
'id': 2277,
'name': 'alice',
'parent': 3522
},
{
'id': 119,
'name': 'gary',
'parent': 232
},
{
'id': 888,
'name': 'gunthe',
'parent': 119
},
{
'id': 750,
'name': 'beavis',
'parent': None
},
{
'id': 555,
'name': 'urte',
'parent': 750
}
]

users_map = {}
for user in users:
users_map[user['id']] = user

users_tree = []
for user in users:
if user['parent'] is None:
users_tree.append(user)
else:
parent = users_map[user['parent']]
if 'childs' not in parent:
parent['childs'] = []
parent['childs'].append(user)

print(users_tree)

#user as {data: user, childs: []}

users_map = {}
for user in users:
users_map[user['id']] = {'data': user, 'childs': []}

users_tree = []
for user in users:
if user['parent'] is None:
users_tree.append(users_map[user['id']])
else:
parent = users_map[user['parent']]
parent['childs'].append(users_map[user['id']])

print(users_tree)

关于python - 如何从有序邻接表构建递归字典树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26207989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com