Найти - Пользователи
Полная версия: Построение дерева каталога на python
Начало » Python для новичков » Построение дерева каталога на python
1 2
Ambassador
Приветствую.
Ребят, помогите, пож-та, мне необходимо написать на python алгоритм построения дерева, результат буду формировать в json .
Модель в бд у меня выглядит так:
+–+————-+——–+
|id |name |parentid|
+–+————-+——–+
|9 |Title 1 |0 |
|10 |Test 1 |9 |
|11 |Test 2 |9 |
|12 |Title 2 |0 |
|13 |Test 3 |12 |
|14 |Test 4 |12 |
+–+————-+——–+

На выходе должен получить следующий вид:
 children:[
  {
    text: "Title 1", id: '9', expanded: true,
    children: [
    {
        text: "Test 1", leaf: true ,
    },
    {
        text: "Test 2", leaf: true
    }
    ]
 },
 {
    text: "Title 2", id: '12', expanded: true,
    children: [
    {
        text: "Test 3", leaf: true ,
    },
    {
        text: "Test 4", leaf: true
    }
    ]
 }
 ]
Пытаюсь сделать так:
     storage = Storage.objects.all()
            for item_sr in list(storage):
                dict_sr = {}
                if item_sr.id_parent_id == 0:
                    dict_sr['text'] = item_sr.name
                    dict_sr['id'] = str(item_sr.id)
                    dict_sr['expanded'] = True
                if item_sr.id_parent_id != 0:
                    dict_sr['children'] = [{'text:' + item_sr.name + ", leaf = True"}]
                list_sr.append(dict_sr)
            result = {'expanded': 'true', 'text': 'Storage', 'children': list_sr}
            jsonFormat = json.dumps(result, indent=4, sort_keys=True, default=str)

Но правильный формат не получается. Помогите правильно написать код
doza_and
Ambassador
пример подходящий мне, но он написан на php.
Вы шутите? На питоне это будет совсем по другому. Все зависит от того из чего вы json собираетесь делать. Модуль json вам в помощь.
 import json
print(json.dumps(data))
Ambassador
doza_and
Вы шутите? На питоне это будет совсем по другому. Все зависит от того из чего вы json собираетесь делать. Модуль json вам в помощь.

import json
print(json.dumps(data))
Не шучу.С json.dumps я понимаю как работать.
Отредактировал свой вопрос
Papa_Svin
Ambassador

И ты вообще не вдупляешь, что вот этот код
if (is_array($cats) && isset($cats[$parent_id])) {
$tree = '<ul>';
foreach ($cats[$parent_id] as $cat) {
$tree .= '<li>' . $cat['name'];
$tree .= build_tree($cats, $cat['id']);
$tree .= '</li>';
}
$tree .= '</ul>';
} else {
return false;
}
return $tree;

строит нифига не json, а ul-список?????


Ambassador
papa_svin - я понимаю это. Конечно же мне ul список не нужен.
Главное в моем вопросе это как построить необходимый мне формат структуры данных.
Отредактировал вопрос
Rodegast
Деревья обходят рекурсией. Вот пример:
 >>> tree = [("root", [("vetka", [("vetka2", []), ("vetka3", [])])]), ("root2", [])]
>>> def get_tree(t, n=0):
...     for name, tr in t:
...         print "  "*n + name
...         if tr:
...             get_tree(tr, n+1)
...
>>> get_tree(tree)
root
   vetka
     vetka2
     vetka3
root2
Ambassador
Rodegast
Деревья обходят рекурсией. Вот пример:

>>> tree = [(“root”, [(“vetka”, [(“vetka2”, ), (“vetka3”, )])]), (“root2”, )]
>>> def get_tree(t, n=0):
… for name, tr in t:
… print “ ”*n + name
… if tr:
… get_tree(tr, n+1)

>>> get_tree(tree)
root
vetka
vetka2
vetka3
root2

Спасибо.

А если необходимо пройти рекурсией вот такой список:
 mylist =[{'id': '1', 'name': 'title1', 'id_parent': '0'}, {'id': '2', 'name': 'title2', 'id_parent': '1'}, {'id': '3', 'name': 'title3', 'id_parent': '1'}, {'id': '4', 'name': 'title4', 'id_parent': '0'}, {'id': '5', 'name': 'title5', 'id_parent': '4'}]
Как будет выглядеть код что бы был вид?:
 title1
   title2
   title3
 title4
   title5

Rodegast
 >>> mylist =[{'id': '1', 'name': 'title1', 'id_parent': '0'}, {'id': '2', 'name': 'title2', 'id_parent':
 '1'}, {'id': '3', 'name': 'title3', 'id_parent': '1'}, {'id': '4', 'name': 'title4', 'id_parent': '0'},
 {'id': '5', 'name': 'title5', 'id_parent': '4'}]
>>> def get_parent(id_parent):
...      return [ x for x in mylist if not x["id"] == id_parent and x["id_parent"] == id_parent ]
...
>>> def get_tree(t, n=0):
...     for x in get_parent(t):
...         print "  " * n + x["name"]
...         get_tree(x["id"], n+1)
...
>>> get_tree("0")
title1
  title2
  title3
title4
  title5
Ambassador
Rodegast - спасибо большое за помощь.
Ambassador
Подскажите, пож-та, теперь что бы на основании функций get_parent и get_tree создать объект вида :
 {expanded: true, text: "Main Title",
            children:[
              {
                text: "Title 1", id: '1', expanded: true,
                children: [
                {
                    text: "title2", leaf: true ,
                },
                {
                    text: "title3", leaf: true
                }
                ]
             },
             {
                text: "Title 4", id: '4', expanded: true,
                children: [
                {
                    text: "title5", leaf: true ,
                }
                ]
             }
             ]
        }

мне потребуется использовать к примеру этот класс дерева :
 class Tree(object):
    def __init__(self, data, children=None, parent=None):
        self.data = data
        self.children = children or []
        self.parent = parent
    def add_child(self, data):
        new_child = Tree(data, parent=self)
        self.children.append(new_child)
        return new_child
    def is_root(self):
        return self.parent is None
    def is_leaf(self):
        return not self.children
    def __str__(self):
        if self.is_leaf():
            return str(self.data)
        return '{data} [{children}]'.format(data=self.data, children=', '.join(map(str, self.children)))

Или это можно сделать более лаконично ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB