Модифицированный обход дерева предзаказа в структуру 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' }
]
}
]