Модифицированный обход дерева предзаказа в структуру Python

Привет, я пытаюсь представить Modified-Preorder-Tree-Traversal как структуру Python, которую я могу затем вывести в json, так как моей текущей целью является отображение дерева в jstree.

Допустим, у меня есть таблица, как показано http://imrannazar.com/Modified-Preorder-Tree-Traversal (в каждой строке также есть parent_id в моем случае) примерно так

    Node ID   Name       Left MPTT value     Right MPTT value       ParentID
     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

Формат Json для Jstree похож на

    [
      {
       "data" : "Root",
       "children" : [ 
           {
              "data":"Articles",
               "children : [
                             {"data":"Fiction"},
                             {"data":"Reference"}
                            ]
           },
           {"data":"Portfolio"},
           {"data":"Contact"}]
      },
    ]

Как я могу преобразовать приведенную выше таблицу в формат Python для вывода этого JSON.

Я думал о том, чтобы использовать вложенный словарь, как показано ниже

    class NestedDict(dict):
        def __missing__(self, key):
            return self.setdefault(key, NestedDict())

Не уверен, что алгоритм мне нужен, хотя.

Любая помощь с благодарностью.

Спасибо

1 ответ

Решение

Вы должны действительно попытаться сделать это самостоятельно, показать, что вы сделали, и где это не работает. Но у меня было несколько свободных минут, так что...

Для разбора таблицы вы можете использовать csv модуль. Я оставлю это тебе.

Вероятно, не оптимальное решение, но это сделает это:

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' }
        ]
    }
]
Другие вопросы по тегам