如何对数据进行分类以获得树状结构



我正在尝试显示有关应用程序和他的数据源的信息。我想知道如何从我的实际行中获得这种类型的输出。

这是我的原始数据,有从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

编辑有什么方法可以浏览列表以获得此输出吗?谷歌有什么概念吗?我不知道如何启动

感谢所有

collections.defaultdict会动态创建丢失的值。我认为它非常适合你的用例。

由于您的数据集是列表dict,因此我使用了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'tt{ds}')

这是一个文本文件,还是可以选择将输出放在文本文件中?如果是这样,您可以打开文件,遍历它的行,然后继续将每一行都视为要拆分的字符串。

伪代码:

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

然后,你可以把这些放在字典里,比如:

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

根据流的其余部分,您可以使用漂亮的print之类的东西来输出您所解释的代码。

这里的关键是使用树。你可以用这样一个类很简单地做到这一点:

class Node:
def __init__(self,d):
self.children = dict()
self.depth = d
def add(self,name):
self.children[name] = Node(self.depth+1)

这里,每个Node都是一个对象,具有一个深度变量和一个包含其所有子的dictionary

首先,您必须将数据表示为一个干净的行列表,仅用空格分隔

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",
]

现在,使用一点递归,你可以很容易地对数据进行排序:

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

这种方法的优点是,您可以将它与任意多的参数一起使用。这里有三个(公司、应用程序和数据源(,但您可以有更多。。。

我希望我的代码能帮助你!

最新更新