5

我是 python 新手。我想编写一个程序,在stdout. 我理想的输出是这样的:

0
|__0
|__4
|  |__360
|      |__1000
272
|__3460

我收集的数据如下:

0       : [0, 4]
4       : [360]
272     : [3460]
368     : [4184]
472     : [504, 576, 7016]
568     : [584, 640]
576     : [664, 672]
640     : [1048]
664     : [368, 372, 512, 788]
788     : [2120, 2720, 2976, 2996, 3956, 3980]

左列是父进程id,右列是子进程id。我将数据放在一个名为dic. 所以字典key是父进程ID,字典value是由子进程ID组成的列表。

我的代码是这样的:

for key in dic.keys():
    print key, '\n|'
    for v in dic[key]:
        print '__', v, '\n|'

问题是我只能输出两层树。以数据为例,576因为父 id 也是 的子 id 472。所以576,664、672应该放在472的子树中。我的代码不适用于这个。看来我们需要使用递归函数。但我不知道如何处理它。

你们能给我提示吗?


编辑:从我收集的数据来看,有一些父母 ID 没有祖父母。所以最终的输出应该是一片森林。不是单根树。

4

1 回答 1

4

这个怎么样:

def printTree(parent, tree, indent=''):
  print parent
  if parent not in tree:
    return
  for child in tree[parent][:-1]:
    sys.stdout.write(indent + '|-')
    printTree(child, tree, indent + '| ')
  child = tree[parent][-1]
  sys.stdout.write(indent + '`-')
  printTree(child, tree, indent + '  ')

tree = {
  0       : [0, 4],
  4       : [360],
  272     : [3460],
  368     : [4184],
  472     : [504, 576, 7016],
  568     : [584, 640],
  576     : [664, 672],
  640     : [1048],
  664     : [368, 372, 512, 788],
  788     : [2120, 2720, 2976, 2996, 3956, 3980]
}

printTree(472, tree)

printTree(472, tree)
472
|-504
|-576
| |-664
| | |-368
| | | `-4184
| | |-372
| | |-512
| | `-788
| |   |-2120
| |   |-2720
| |   |-2976
| |   |-2996
| |   |-3956
| |   `-3980
| `-672
`-7016

也许这就是你喜欢的方式,我不知道。

它没有任何内置的递归检查,所以如果你尝试它0,它将陷入无限递归(最终由于堆栈溢出而中止)。您可以通过传递已处理节点的跟踪来自己检查递归。

这也找不到您森林中的树根列表,因此您也必须这样做。(但这听起来像是另一个问题。)

于 2013-05-06T11:34:59.743 回答