Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2018 23:39:06

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

Приветствую.
Ребят, помогите, пож-та, мне необходимо написать на 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)

Но правильный формат не получается. Помогите правильно написать код

Отредактировано Ambassador (Сен. 27, 2018 11:22:12)

Офлайн

#2 Сен. 27, 2018 08:45:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

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



Отредактировано doza_and (Сен. 27, 2018 08:46:57)

Офлайн

#3 Сен. 27, 2018 10:19:22

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

doza_and
Вы шутите? На питоне это будет совсем по другому. Все зависит от того из чего вы json собираетесь делать. Модуль json вам в помощь.

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

Офлайн

#4 Сен. 27, 2018 10:26:47

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

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-список?????


Офлайн

#5 Сен. 27, 2018 11:24:32

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

papa_svin - я понимаю это. Конечно же мне ul список не нужен.
Главное в моем вопросе это как построить необходимый мне формат структуры данных.
Отредактировал вопрос

Офлайн

#6 Сен. 27, 2018 11:51:45

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

Деревья обходят рекурсией. Вот пример:

 >>> 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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Сен. 27, 2018 11:58:47)

Офлайн

#7 Сен. 27, 2018 13:31:16

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

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

Отредактировано Ambassador (Сен. 27, 2018 13:33:11)

Офлайн

#8 Сен. 27, 2018 15:11:09

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

 >>> 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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Сен. 27, 2018 16:28:11

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

Rodegast - спасибо большое за помощь.

Офлайн

#10 Сен. 27, 2018 23:47:58

Ambassador
Зарегистрирован: 2018-09-26
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Построение дерева каталога на python

Подскажите, пож-та, теперь что бы на основании функций 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)))

Или это можно сделать более лаконично ?

Отредактировано Ambassador (Сен. 27, 2018 23:50:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version