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

时间:2014-10-05 22:44:01

标签: python django algorithm recursion dictionary

我一直在试图弄清楚这一天,我的智慧结束了。也许我只是为了这个而老去。

我正在尝试为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'}},
        ]},
]

'数据'保留记录,如果有孩子的话,“孩子们”。是更多数据的列表' dicts(也可以包含递归的子列表等)

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

e.g:

[
    {'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'}
]

如何将其转换为符合树状的字典,如下所示(拼写错误除外):

[
{'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我手动输入示例比我剩下的时间(除了晚餐时间)更有趣。

1 个答案:

答案 0 :(得分:1)

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

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)