Форум сайта python.su
Здравствуйте. Помоги пожалуйста закончить рекурсию. Есть список словарей. Каждый словарь может иметь дочерние элементы и каждый дочерний элемент может иметь свои дочерние элементы. Этот список похож на список в формате JSON. Вот примерный список:
list=[ { "id": 1, "parent": 0, "children": [ { "id": 3, "parent": 1, "children": [ { "id": 6, "parent": 3, "children": [] } ] }, { "id": 4, "parent": 1, "children": [] }, { "id": 5, "parent": 1, "children": [] }, ] }, { "id": 2, "parent": 0, "children": [ { "id": 7, "parent": 2, "children": [ { "id": 8, "parent": 7, "children": [ { "id": 9, "parent": 8, "children": [] }, { "id": 10, "parent": 8, "children": [] } ] } ] } ] } ] #А вот функция: def flatten(list,i): elementList.append('\t'.join([str(list[i]['id']), str(list[i]['parent'])]) + '\n') if list[i]['children']: flatten(list[i]['children'],i) return flatten(list,0)
Отредактировано misterMinister (Сен. 7, 2021 21:10:53)
Офлайн
использвать list в качестве имени переменной плохая идея, ровно как и использвания любых ключевых слов или builtin типов/функций
Вот тут,
flatten(list[i]['children'],i)
[code python][/code]
Отредактировано PEHDOM (Сен. 7, 2021 12:21:32)
Офлайн
misterMinisterСформулируй задачу. Нет такой задачи “закончить рекурсию”, потому что это может означать что угодно.
Помоги пожалуйста закончить рекурсию.
misterMinisterА нужно, чтобы она делала что? Это мы должны догадаться типа.
Моя функция проходит по первому объекту включая дочернии, потом начинает прыгать.
Офлайн
PEHDOMВот он-то мне и нужен. Я не понимаю что надо передать в функцию и когда ее вызывать
И у вас отсутвует перебор элеметов списка.
py.user.nextЯ думал, что достаточно рассказал про задачу. Попробую написать более подробно. Значит так, есть список словарей, где каждый словарь идет так:
Сформулируй задачу. Нет такой задачи “закончить рекурсию”, потому что это может означать что угодно.
{id:1,parent:0,children:[]}
{ "id": 1, "parent": 0, "children": [ { "id": 3, "parent": 1, "children": [ { "id": 6, "parent": 3, "children": [] } ] }, { "id": 4, "parent": 1, "children": [] }, { "id": 5, "parent": 1, "children": [] }, ] },
[ ['id','parent'], ['1','0'], ['3','1'], ['6','3'], ['4','1'], ['5','1'] ]
['id','parent'], ['1','0'], ['3','1'], ['6','3'] ]
Офлайн
lst=[ { "id": 1, "parent": 0, "children": [ .... ] def flatten(lst): for item in lst: print('\t'.join([str(item['id']), str(item['parent'])])) if item['children']: flatten(item['children']) flatten(lst) >>> 1 0 3 1 6 3 4 1 5 1 2 0 7 2 8 7 9 8 10 8 >>>
[code python][/code]
Отредактировано PEHDOM (Сен. 8, 2021 15:09:46)
Офлайн
>>> def f(dct, acc): ... kid = str(dct['id']) ... kparent = str(dct['parent']) ... acc.append([kid, kparent]) ... for i in dct['children']: ... acc = f(i, acc) ... return acc ... >>> dct = { ... 'id': 1, ... 'parent': 0, ... 'children': [ ... { ... 'id': 3, ... 'parent': 1, ... 'children': [ ... { ... 'id': 6, ... 'parent': 3, ... 'children': [] ... } ... ] ... }, ... { ... 'id': 4, ... 'parent': 1, ... 'children': [] ... }, ... { ... 'id': 5, ... 'parent': 1, ... 'children': [] ... } ... ] ... } >>> >>> out = f(dct, []) >>> out [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>> >>> out1 = f(dct, []) >>> out1 [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>> >>> out2 = f(dct, []) >>> out2 [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>>
def f(dct, acc=[]): ... out = f(dct)
>>> def f(dct, acc=[]): ... kid = str(dct['id']) ... kparent = str(dct['parent']) ... acc.append([kid, kparent]) ... for i in dct['children']: ... acc = f(i, acc) ... return acc ... >>> dct = { ... 'id': 1, ... 'parent': 0, ... 'children': [ ... { ... 'id': 3, ... 'parent': 1, ... 'children': [ ... { ... 'id': 6, ... 'parent': 3, ... 'children': [] ... } ... ] ... }, ... { ... 'id': 4, ... 'parent': 1, ... 'children': [] ... }, ... { ... 'id': 5, ... 'parent': 1, ... 'children': [] ... } ... ] ... } >>> >>> out = f(dct) >>> out [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>> >>> out1 = f(dct) >>> out1 [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1'], ['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>> >>> out2 = f(dct) >>> out2 [['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1'], ['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1'], ['1', '0'], ['3', '1'], ['6', '3'], ['4', '1'], ['5', '1']] >>>
Отредактировано py.user.next (Сен. 9, 2021 00:46:43)
Офлайн
Спасибо всем еще раз. Я сам позже нашел решение, в точности такое же как и у PEHDOM
Офлайн