Форум сайта python.su
							
  0  
								
								Здравствуйте. Помоги пожалуйста закончить рекурсию. Есть список словарей. Каждый словарь может иметь дочерние элементы и каждый дочерний элемент может иметь свои дочерние элементы. Этот список похож на список в формате 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)
Офлайн
							
  294  
								
								использвать list в качестве имени переменной плохая идея, ровно как и использвания любых ключевых слов или builtin типов/функций
Вот тут,
flatten(list[i]['children'],i)
[code python][/code]
Отредактировано PEHDOM (Сен. 7, 2021 12:21:32)
Офлайн
							
  857  
								
								misterMinisterСформулируй задачу. Нет такой задачи “закончить рекурсию”, потому что это может означать что угодно.
Помоги пожалуйста закончить рекурсию.
misterMinisterА нужно, чтобы она делала что? Это мы должны догадаться типа.
Моя функция проходит по первому объекту включая дочернии, потом начинает прыгать.
Офлайн
							
  0  
								
								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'] ]
Офлайн
							
  294  
								
								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)
Офлайн
							
  857  
								
								>>> 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)
Офлайн
							
  0  
								
								Спасибо всем еще раз. Я сам позже нашел решение, в точности такое же как и у PEHDOM
Офлайн