Форум сайта python.su
0
Приветствую.
Ребят, помогите, пож-та, мне необходимо написать на 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)
Офлайн
253
AmbassadorВы шутите? На питоне это будет совсем по другому. Все зависит от того из чего вы json собираетесь делать. Модуль json вам в помощь.
пример подходящий мне, но он написан на php.
import json print(json.dumps(data))
Отредактировано doza_and (Сен. 27, 2018 08:46:57)
Офлайн
0
doza_andНе шучу.С json.dumps я понимаю как работать.
Вы шутите? На питоне это будет совсем по другому. Все зависит от того из чего вы json собираетесь делать. Модуль json вам в помощь.
import json
print(json.dumps(data))
Офлайн
1
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;Офлайн
0
papa_svin - я понимаю это. Конечно же мне ul список не нужен.
Главное в моем вопросе это как построить необходимый мне формат структуры данных.
Отредактировал вопрос
Офлайн
186
Деревья обходят рекурсией. Вот пример:
>>> 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)
Офлайн
0
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)
Офлайн
186
>>> 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
Офлайн
0
Rodegast - спасибо большое за помощь.
Офлайн
0
Подскажите, пож-та, теперь что бы на основании функций 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)
Офлайн