Ключом здесь является использование дерева. Вы можете сделать это довольно просто с помощью такого класса:
class Node:
def __init__(self,d):
self.children = dict()
self.depth = d
def add(self,name):
self.children[name] = Node(self.depth+1)
Здесь каждый узел - это объект с переменной глубины и словарем, содержащим все его дочерние элементы
Сначала вам придется представить ваши данные в виде чистого списка строк, разделенных только пробелами
data = [
"Company1 application1 datasource=ds1",
"Company1 application1 datasource=ds2",
"Company1 application1 datasource=ds3",
"Company1 application2 datasource=ds1",
"Company1 application2 datasource=ds2",
"Company2 application1 datasource=ds1",
"Company2 application1 datasource=ds2",
"Company2 application2 datasource=ds1",
"Company2 application2 datasource=ds2",
"Company2 application2 datasource=ds3",
]
Теперь, используя немного рекурсии, yon может легко отсортировать ваши данные:
def insert(t,branch):
if len(branch):
if branch[0] not in t.children:
t.add(branch[0])
insert(t.children[branch[0]],branch[1:])
t = Node(0)
for line in data:
insert(t,line.split())
def display(t):
if t.children:
for c in t.children:
print("\t" * t.depth + c)
display(t.children[c])
display(t)
Вывод:
Company1
application1
datasource=ds1
datasource=ds2
datasource=ds3
application2
datasource=ds1
datasource=ds2
Company2
application1
datasource=ds1
datasource=ds2
application2
datasource=ds1
datasource=ds2
datasource=ds3
Преимущество этого метода заключается в том, что вы можете использовать его с любым количеством параметров. Здесь у вас есть три (компания, приложение и источник данных), но вы можете иметь больше ...
Я надеюсь, что мой код поможет вам!