我有一个类Test的实例列表。此类包含name
和parent
[Test('a', ''), Test('b', ''), Test('c', 'a'), Test('d', 'a'), Test('e', 'c')]
第一个参数是name,second parent。父arg只是父类的arg name
。
我想将此列表转换为字符串,如:
Test('a', '')
|-- Test('c', 'a')
|-- Test('e', 'c')
|-- Test('d', 'a')
Test('b', '')
我正在寻找将此列表转换为字符串的最有效CPU方法。列表中的项目可以嵌套在倍数(10,100,1000,..)级别,我不关心使用的内存。
答案 0 :(得分:2)
以下是按原样运行的代码。基本上将数组转换为树,然后使用递归DFS打印它(如果需要,可以使用迭代DFS):
class Test:
def __init__(self, name, parent):
self.name = name
self.parent = parent
def __repr__(self):
return "Test('"+self.name+"', '"+self.parent+"')"
li = [Test('a', ''), Test('b', ''), Test('c', 'a'), Test('d', 'a'), Test('e', 'c')]
dict = {"":(None,[])} #name to (node,children)
#add nodes
for item in li:
dict[item.name] = (item, [])
#add children
for item in li:
dict[item.parent][1].append(dict[item.name])
def printTree(dict, name, indent):
newIndent=indent
if name!="":
print(indent + str(dict[name][0]))
if indent == "": newIndent=" |-- "
else: newIndent = " "+indent
for child in dict[name][1]:
printTree(dict, child[0].name, newIndent)
printTree(dict, "", "")
答案 1 :(得分:0)
你应该使用另一个容器,如:
class Test:
def __init__(self, name, sub=None):
self.name = name
self.sub = sub if sub is not None else []
elements = [Test('a', [Test('c', [Test('e')]), Test('d')]), Test('b')]
然后只需迭代elements
即可打印:
def show(x, indent=0):
for i in x:
print('\t'*indent + 'Test(%r)' % i.name)
show(i.sub, indent+1)
show(elements)
应打印:
Test('a')
Test('c')
Test('e')
Test('d')
Test('b')
您可以将缩进更改为您喜欢的任何内容(我正在使用制表符)。
答案 2 :(得分:0)
如果您最终使用DFS作为fiver建议您可以使用networkx
import networkx as nx
stuff=[('a', ''), ('b', ''), ('c', 'a'), ('d', 'a'), ('e', 'c')]
G=nx.DiGraph()
for i in stuff:
G.add_edge(i[1],i[0])
print G.adj
然后它是用DFS迭代它的主要部分