【问题标题】:python - going from a stack trace to a treepython - 从堆栈跟踪到树
【发布时间】:2014-12-24 19:23:31
【问题描述】:

一段时间以来,我一直在绞尽脑汁寻找一种简单的递归方式来执行此操作 - 假设我有一个堆栈状态序列,看起来像这样,作为列表列表:

[ 
[a]
[a,b]
[a,b,c]
[a,b]
[a,b,d]
[a,b]
[a]
[a,e]
]

我想用它来表示它,本质上是一棵树,但使用嵌套列表层,而不为树定义一个新类。

上面的树格式可能看起来像这样

[a, [b, [c],
        [d]],
    [e]    ]

本质上说,由于 c 和 d 在 b 之后,它们是 b 的子级,并且由于它们在堆栈跟踪中没有追随者,因此它们后面没有任何内容(或表示没有子级的空列表)。所以这也足够了:

[a, [b, [c, []],
        [d, []],
    [e, []      ]

基本上代表的树是

   a
  / \
 e   b
    / \
   c   d

但完全没有课程。是的,我知道它是不干净的,并且类可能是做到这一点的干净方式,但我对没有类的解决方案感兴趣。

【问题讨论】:

  • 到目前为止你尝试过什么代码?

标签: python tree stack stack-trace


【解决方案1】:

这在这里做你想要的,同时将每个节点放在它自己的列表中,这更具可读性和可用性恕我直言:

input =  
[['a'],
 ['a', 'b'],
 ['a', 'b', 'c'],
 ['a', 'b'],
 ['a', 'b', 'd'],
 ['a', 'b'],
 ['a'],
 ['a', 'e']]

output = []
item_node = {}
for lst in input:
    for i in range(len(lst)):
        if lst[i] not in item_node:
            item_node[lst[i]] = [lst[i], []]
            if i == 0:
                output.append(item_node[lst[i]])
            else:
                item_node[lst[i-1]][1].append(item_node[lst[i]])

Out[47]: [['a', [['b', [['c', []], ['d', []]]], ['e', []]]]]

首先使用相同的设置以您想要的格式获取它:

for lst in input:
    for i in range(len(lst)):
        if lst[i] not in item_node:
            item_node[lst[i]] = [lst[i]]
            if i == 0:
                output.append(item_node[lst[i]])
            else:
                item_node[lst[i-1]].append(item_node[lst[i]])


Out[58]: [['a', ['b', ['c'], ['d']], ['e']]]

要获得第二个选项:

for lst in input:
    for i in range(len(lst)):
        if lst[i] not in item_node:
            item_node[lst[i]] = []
            if i == 0:
                output.append(lst[i])
                output.append(item_node[lst[i]])
            else:
                item_node[lst[i-1]].append(lst[i])
                item_node[lst[i-1]].append(item_node[lst[i]])
Out[54]: ['a', ['b', ['c', [], 'd', []], 'e', []]]

【讨论】:

  • 谢谢 - 我认为让我失望的是我完全相信我至少需要一些递归。
猜你喜欢
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2011-05-25
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多