嵌套列表到字符串

时间:2011-07-03 04:24:49

标签: python arrays nested

我有一个类Test的实例列表。此类包含nameparent

等方法
[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,..)级别,我不关心使用的内存。

3 个答案:

答案 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迭代它的主要部分