У меня есть динамическая c древовидная структура, представленная в виде списка списков - вот один из таких примеров с пробелами для иллюстрации структуры:
[['first',
[0, 'list1'],
[1, 'list2'],
[2, 'list3']],
['second',
['second_subda',
[0, 'tup1'],
[1, 'tup2']],
['second_subdb',
[0, 'tup3'],
[1, 'tup4']]],
['third',
['third_subda',
[0, 'a'],
[1, 'b'],
[2, 'c'],
[3,
['d',
[0, 'e'],
[1, 'f'],
[2,
['g',
[0, 1],
[1, 2],
[2, 3]]]]]]]]
И я хочу извлечь Исходя из этого, все листовые узлы, а также пути, необходимые для их достижения:
например, из приведенной выше структуры, я хочу вернуть:
[ ( 'list1', ['first', 0 ] ) ,
( 'list2', ['first', 1 ] ) ,
( 'list3', ['first', 2 ] ) ,
( 'tup1' , ['second', 'second_subda', 0 ] ) ,
( 'tup2' , ['second', 'second_subda', 1 ] ) ,
( 'tup3' , ['second', 'second_subdb', 0 ] ) ,
( 'tup4' , ['second', 'second_subdb', 1 ] ) ,
( 'a' , ['third', 'third_subda', 0 ] ) ,
( 'b' , ['third', 'third_subda', 1 ] ) ,
( 'c' , ['third', 'third_subda', 2 ] ) ,
( 'e' , ['third', 'third_subda', 3 , 'd', 0 ] ) ,
( 'f' , ['third', 'third_subda', 3 , 'd', 1 ] ) ,
( 1 , ['third', 'third_subda', 3 , 'd', 2 , 'g' , 0 ] ) ,
( 2 , ['third', 'third_subda', 3 , 'd', 2 , 'g' , 1 ] ) ,
( 3 , ['third', 'third_subda', 3 , 'd', 2 , 'g' , 2 ] )]
т.е. для каждого "листа" Я хочу извлечь кортеж, состоящий из всех значений листа и списка всех начальных записей списка, которые описывают уникальный путь для достижения этого элемента листа. Я должен остаться со списком этих кортежей, где количество элементов в списке соответствует количеству листовых узлов в дереве.
Я пытался построить это дерево в модуле, подобном networkx
, но для моего варианта использования издержки дополнительного модуля излишни. Я просто хочу придерживаться ванильного python кода, где это возможно.