如何从有序的邻接列表构建递归字典树

2024-05-29 01:43:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在尝试为django treebeard上的load\u 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”dict的列表(也可以递归地包含子项列表等)

我以有序列表的形式获取数据(按深度优先排序,而不是按id排序):

例如:

^{pr2}$

我如何将它转换为一个符合树的字典,它看起来像这样(排字错误除外):

[
{'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我手工打印这个例子比我今天剩下的时间(除了晚餐时间)更有乐趣。在


Tags: djangonamenoneid列表data排序时间
1条回答
网友
1楼 · 发布于 2024-05-29 01:43:03

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

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)

相关问题 更多 >

    热门问题