Как классифицировать данные, чтобы получить древовидную структуру - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь показать информацию о приложениях и его источниках данных. Я хотел бы знать, как получить этот тип выходных данных из моих реальных строк.

Это мои необработанные данные, есть строки, полученные из bash с подпроцессом, выходные данные могут быть изменены, потому что команды подпроцесса комбинация find, grep и cut.

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

И мой желаемый результат будет:

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

РЕДАКТИРОВАТЬ Есть ли способ до go через список, чтобы получить этот вывод? Любая концепция для Googleit? Я не знаю, как начать

Спасибо за все

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

collection.defaultdict создает пропущенные значения на лету. Я думаю, что он идеально подходит для вашего варианта использования.

Так как ваш набор данных является dict из dict s из списка s, я использовал defaultdict(lambda: defaultdict(list)) , Остальное тривиально

from collections import defaultdict

s = '''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'''

companies = defaultdict(lambda: defaultdict(list))

for line in s.splitlines():
    co_app, ds = line.split(' ')
    co, app = co_app.split('/')
    companies[co][app].append(ds)

for co, applications in companies.items():
    print(co)
    for app, datasets in applications.items():
        print(f'\t{app}')
        for ds in datasets:
            print(f'\t\t{ds}')
0 голосов
/ 21 февраля 2020

Ключом здесь является использование дерева. Вы можете сделать это довольно просто с помощью такого класса:

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

Преимущество этого метода заключается в том, что вы можете использовать его с любым количеством параметров. Здесь у вас есть три (компания, приложение и источник данных), но вы можете иметь больше ...

Я надеюсь, что мой код поможет вам!

0 голосов
/ 21 февраля 2020

Это текстовый файл, или у вас есть возможность поместить вывод в текстовый файл? Если это так, вы можете открыть файл, перебирать его строки и затем обрабатывать каждую строку как строку, которую вы будете разбивать.

Псевдокод:

fi = open('myfile.txt', 'r')
for line in fi:
    comp_application,datasource = line.split(' ')
    comp,application = comp_application.split('/')

Затем вы можете поместите их в словарь примерно так:

{'company1': {'application1': ['ds1', 'ds2']}}

В зависимости от остальной части вашего потока вы можете использовать что-то вроде pretty print для вывода кода, как вы объяснили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...