6 votes

Créer un arbre de processus comme la commande pstree avec python sous linux

Je suis novice en matière de python. Je veux écrire un programme qui produise un dessin en forme d'arbre sur l'écran de l'ordinateur. stdout . Mon rendement idéal est comme :

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

Les données que j'ai recueillies sont les suivantes :

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]

La colonne de gauche est l'identifiant du processus parent, et la colonne de droite est l'identifiant du processus enfant. Je mets les données dans un dictionnaire appelé dic . Donc le dictionnaire key est l'identifiant du processus parent, et le dictionnaire value est une liste composée d'ID de processus enfant.

Mon code est le suivant :

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

La question est que je ne peux produire que des arbres à deux couches. Prenez les données par exemple, 576 en tant qu'id parent est aussi un id enfant de 472 . Donc 576 664, 672 doivent être placés dans la sous-arborescence de 472. Mon code ne fonctionne pas pour cela. Il semble que nous devions utiliser des fonctions récursives. Mais je ne sais pas comment le faire.

Pourriez-vous me donner des conseils ?


EDIT : D'après les données que j'ai collectées, il y a des IDs de parents qui n'ont pas de grand parent. Donc le résultat final devrait être une forêt. Pas un arbre à racines simples.

4voto

Alfe Points 12023

Que dites-vous de ça ?

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

Peut-être que c'est comme ça que tu l'aimes, je ne sais pas.

Il n'a pas de contrôle intégré pour les récursions, donc si vous l'essayez sur 0 il se lancera dans une récursion sans fin (et finira par s'arrêter à cause d'un débordement de pile). Vous pouvez vérifier les récursions vous-même en passant une trace des noeuds déjà traités.

Cette opération ne permet pas non plus de trouver la liste des racines d'arbres dans votre forêt, vous devrez donc vous en charger également. (Mais cela ressemble à une autre question).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X