По номенклатуре я не знаю ни одного стандартного описания, но я бы описал ваше первое как вложенную структуру данных;второй в виде списка, показывающего последовательный отступ.
Вот программа на Python, которая:
- Определяет первый как вложенный узел как 2 кортежа имени, за которым следует список его дочерних элементов (который может быть пустым списком, обозначающим конечные элементы).
- Второй формат представляет собой список из двух кортежей, первый элемент которых имеет отступ, второй элемент - имя.
Программаконвертирует в обоих направлениях и сравнивает, чтобы показать, что вы можете в обоих направлениях конвертировать.
from pprint import pprint as pp
def to_list(node, depth=0, flat=None):
if flat is None:
flat = []
if node:
flat.append((depth, node[0]))
for child in node[1]:
to_list(child, depth + 1, flat)
return flat
def to_nest(lst, depth=0, level=None):
if level is None:
level = []
while lst:
d, name = lst[0]
if d == depth:
children = []
level.append((name, children))
lst.pop(0)
elif d > depth: # down
to_nest(lst, d, children)
elif d < depth: # up
return
return level[0] if level else None
if __name__ == '__main__':
print('Start Nest format:')
nest = ('root', [('a', [('a.1', []), ('a.2', [])]), ('b', [])])
pp(nest, width=20)
print('\n... To List format:')
as_list = to_list(nest)
pp(as_list, width=20)
print('\n... To Nest format:')
as_nest = to_nest(as_list)
pp(as_nest, width=20)
assert nest == as_nest
Вывод:
Start Nest format:
('root',
[('a',
[('a.1', []),
('a.2', [])]),
('b', [])])
... To List format:
[(0, 'root'),
(1, 'a'),
(2, 'a.1'),
(2, 'a.2'),
(1, 'b')]
... To Nest format:
('root',
[('a',
[('a.1', []),
('a.2', [])]),
('b', [])])
Конечно, структуры данных могут использовать namedtuples, но я не хочу.