修改了Python结构的前序树遍历

修改了Python结构的前序树遍历,python,jstree,mptt,Python,Jstree,Mptt,嗨,我试图表示一个修改的前序树遍历 作为Python结构,我可以输出到json,因为我当前的目标是在 假设我有一张表,如图所示 (在我的例子中,每一行也有一个parent_id)如下 jstree的Json格式如下 [ { "data" : "Root", "children" : [ { "data":"Articles", "children : [

嗨,我试图表示一个修改的前序树遍历 作为Python结构,我可以输出到json,因为我当前的目标是在

假设我有一张表,如图所示 (在我的例子中,每一行也有一个parent_id)如下

jstree的Json格式如下

    [
      {
       "data" : "Root",
       "children" : [ 
           {
              "data":"Articles",
               "children : [
                             {"data":"Fiction"},
                             {"data":"Reference"}
                            ]
           },
           {"data":"Portfolio"},
           {"data":"Contact"}]
      },
    ]
如何将上表转换为Python格式以 输出这个json

我想用嵌套字典 如下

但我不确定我需要的算法

非常感谢您的帮助


谢谢

你真的应该试着自己做,展示你做了什么以及哪里不起作用。但我有几分钟空闲,所以

要解析表,可以使用模块。我把这个留给你

可能不是最佳解决方案,但这样做可以:

datain = (
    (1,'Root',1,16,-1),
    (2,'Articles',2,11,1),
    (5,'Fiction',3,8,2),
    (7,'Fantasy',4,5,5),
    (8,'Sci-fi',6,7,5),
    (6,'Reference',9,10,2),
    (3,'Portfolio',12,13,1),
    (4,'Contact',14,15,1),
    )

def convert_to_json(data):
    node_index = dict()
    parent_index = dict()
    for node in data:
        node_index[node[0]] = node
        parent_index.setdefault(node[4],[]).append(node)

    def process_node(index):
        result = { 'data' : node_index[index][1] }
        for node in parent_index.get(index,[]):
            result.setdefault('children',[]).append(process_node(node[0]))
        return result

    node = process_node(1)
    return [node]
返回:

[
    {
        'data': 'Root',
        'children': [
            {
                'data': 'Articles',
                'children': [
                    {
                        'data': 'Fiction',
                        'children': [
                            { 'data': 'Fantasy' },
                            { 'data': 'Sci-fi' }
                            ]
                    },
                    { 'data': 'Reference' }
                ]
            }, 
            { 'data': 'Portfolio' },
            { 'data': 'Contact' }
        ]
    }
]

谢谢我确实试了很长时间,而不是几分钟。我把自己弄得一团糟。谢谢最后我稍微修改了一下,允许添加兄弟姐妹。我最初尝试的是一种非递归方法,这就是我遇到问题的原因。如果有人有一个非递归的解决方案,出于好奇,我很想看看。@isedev,我有没有办法给你一些这个算法的奖励点?这是一部精彩绝伦的巨著
datain = (
    (1,'Root',1,16,-1),
    (2,'Articles',2,11,1),
    (5,'Fiction',3,8,2),
    (7,'Fantasy',4,5,5),
    (8,'Sci-fi',6,7,5),
    (6,'Reference',9,10,2),
    (3,'Portfolio',12,13,1),
    (4,'Contact',14,15,1),
    )

def convert_to_json(data):
    node_index = dict()
    parent_index = dict()
    for node in data:
        node_index[node[0]] = node
        parent_index.setdefault(node[4],[]).append(node)

    def process_node(index):
        result = { 'data' : node_index[index][1] }
        for node in parent_index.get(index,[]):
            result.setdefault('children',[]).append(process_node(node[0]))
        return result

    node = process_node(1)
    return [node]
[
    {
        'data': 'Root',
        'children': [
            {
                'data': 'Articles',
                'children': [
                    {
                        'data': 'Fiction',
                        'children': [
                            { 'data': 'Fantasy' },
                            { 'data': 'Sci-fi' }
                            ]
                    },
                    { 'data': 'Reference' }
                ]
            }, 
            { 'data': 'Portfolio' },
            { 'data': 'Contact' }
        ]
    }
]