Accueil » Python » Forums Python » Forum général Python » Structure Pere Fils Arborescence

 • Structure Pere Fils Arborescence

Document Actions
Réponses: 11   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • Structure Pere Fils Arborescence

Posté par Laurent le 07/05/2008 19:42
Bonjour, Je souhaite transformer une structure de donnée venant d'Excel (désolé pour la présentation): N° Eq Ea Eb Ec Ed 1 Eq1 2 Ea2 3 Ea3 4 Eb1 5 Eb2 6 Ea4 7 Eb3 8 Ec1 .... et le transformer en : Pere Fils 1 2 1 3 3 4 3 5 1 6 6 7 7 8 .... c'est mon premier gros script et je ne sais pas comment faire Merci

 • Re: Structure Pere Fils Arborescence

Posté par rsaikali le 07/05/2008 20:49
Là par contre je comprends pas tout... (et je dois pas être le seul)
Essaie de présenter mieux tes données avec la balise "code"... parce que là...

 • Re: Structure Pere Fils Arborescence

Posté par Laurent le 07/05/2008 21:20
désolé

code:
N°    Eq     Ea1    Eb2     Ec3     Ed4
1     Eq1    
2            Ea1
3            Ea2
4                   Eb1
5                   Eb2
6            Ea3
7                   Eb3
8                           Ec1
9                           Ec2
10                  Eb4
11                          Ec3
12                                  Ed4
...
par

Pere     Fils
1        2
1        3
3        4
3        5
1        6
6        7
7        8
7        9
6        10
10       11
11       12
...

En espérant être plus clair

Merci

 • Re: Structure Pere Fils Arborescence

Posté par glickind le 08/05/2008 00:22
désolé mais ca manque d'explications:
comment fais-tu pour passer du 1er au 2eme tableau

qq phrases seraient les bienvenues, par exemple:
"dans le 1er tableau, ligne 1 colonne Eq, il y a Eq1
ca signifie que xxx est le père de yyy
j'attribue l'identifiant 1 au père et 2 au fils"

 • Re: Structure Pere Fils Arborescence

Posté par Laurent le 08/05/2008 08:06
Autant pour moi, je suis dedans depuis plusieurs jours (de galères). Voici des explications complémentaires.

Le 1er tableau est une feuille Excel comportant plusieurs colonnes j'ai défini les en-têtes de la façon suivante : colonne A N°, colonne B Eq, colonne C Ea, colonne D Eb... et represente une arborescence de type père/fils dans laquelle chaque ligne est numérotée (les numéros sont consécutifs mais ne commence pas forcément à 1). Ainsi : Eq1 est le père de Ea1, Ea2 et Ea3. Ea2 est le père de Eb1 et Eb2; Ec3 est le père de Ed4 et ainsi de suite.

Le 2ème tableau représente la forme sous laquelle je souhaite obtenir mes informations. En fait je veux récréer mon arborescence précédente avec les numéros de la colonne N° pour les Pères et pour les Fils

Merci de ton aide

 • Re: Structure Pere Fils Arborescence

Posté par Laurent le 08/05/2008 08:07
laurent wrote:
désolé

code:
N°    Eq     Ea    Eb     Ec     Ed
1     Eq1    
2            Ea1
3            Ea2
4                   Eb1
5                   Eb2
6            Ea3
7                   Eb3
8                           Ec1
9                           Ec2
10                  Eb4
11                          Ec3
12                                  Ed4
...
par

Pere     Fils
1        2
1        3
3        4
3        5
1        6
6        7
7        8
7        9
6        10
10       11
11       12
...

En espérant être plus clair

Merci

 • Re: Structure Pere Fils Arborescence

Posté par Laurent le 08/05/2008 08:09
en fait je bricole et n'arrive pas à récupérer le numéro pour les niveau Ec et Ed de plus comme je ne souhaite pas limité le nombre de niveaux, je suis bloqué

Merci à tous

 • Re: Structure Pere Fils Arborescence

Posté par rsaikali le 08/05/2008 11:06
Le plus propre serait d'utiliser des classes, mais ce n'est plus un simple script python.

Chaque objet (classe instanciée) aurait un père et plusieurs fils, eux-même des objets.

Tu te retrouves ainsi avec un objet 'racine' (sans père) Eq1 qui contient comme fils les objets Ea1, Ea2 et Ea3.
L'objet Ea1 n'a pas de fils.
L'objet Ea2 a deux fils Eb1 et Eb2.
Et ainsi de suite...

Un premier jet (à affiner) de la classe serait donc :

code:
class MonTruc(object):

    def __init__(self, name, truc_parent = None):
        self.name = name
        self.parent = truc_parent 
        self.childs =[code]

    def addChild(self, truc_child):
        self.childs.append(truc_child)
[/code]
C'est une première idée, je me rends tout de suite compte qu'il n'y a pas besoin de stocker le parent d'ailleurs, ce parent lui-même connaissant ces fils, on duplique de l'info dans les fils et ca devient le binz quand tu commence à les déplacer d'un parent à l'autre, si besoin.

Enfin je sais pas si je suis bien clair...

Si tu n'en a jamais fait, le mieux est de te trouver un bon tuto sur la programmation orientée objet.

thumb down Re: Structure Pere Fils Arborescence

Posté par rsaikali le 08/05/2008 11:08
Rhhhhaaa, j'ai loupé ma balise 'code'... désolé...

 • Re: Structure Pere Fils Arborescence

Posté par Laurent le 08/05/2008 14:36
Merci pour ta réponse, mais comment je récupère le numéro de ligne correspondant ?

 • Re: Structure Pere Fils Arborescence

Posté par glickind le 10/05/2008 01:18
qq hypotheses:
1- le fichier Excel est stocké au format csv
par exemple le fichier arbre.csv avec comme séparateur la virgule
2- la ligne d'un père est une ou plusieurs lignes avant celle du fils

algorithme:
lorsqu'on lit une ligne, on trouve un fils, le numéro de la colonne indique sa génération
on sauvegarde son identifiant dans la branche courante de l'arbre généalogique
son père se trouve évidemment à la génération précédente sur cette branche
(si l'hypothèse 2 n'est pas vérifiée, il faut reconstruire tout l'arbre au lieu de
ne gérer dynamiquement que la branche courante)

code:

def generation(ligne_en_liste):
    generation=0 # pas trouvee
    for i in range(1,len(ligne_en_liste)):
        if ligne_en_liste: # si l'element est non vide
generation=i
break
return generation


debug=True
#debug=False

fichier_source=open('arbre.csv','r')
# lecture ligne par ligne
ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne

separateur=',' # le separateur du fichier .csv est souvent ',' ou ';'
ligne_en_liste=ligne.split(separateur)

# initialisation de la branche_courante
branche_courante=ligne_en_liste # peu importe les valeurs initiales, l'important c'est la taille :)

# ligne suivante
# 1,Eq,,,,,
ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne

ligne_en_liste=ligne.split(separateur)
generation_courante=generation(ligne_en_liste)
branche_courante=ligne_en_liste[0] # on recupere le no de ligne
if debug: print "branche_courante=[%s]" % branche_courante

ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne
while ligne: # tant qu'on n'est pas a la fin du fichier
ligne_en_liste=ligne.split(separateur)
generation_courante=generation(ligne_en_liste)
branche_courante=ligne_en_liste[0] # on recupere le no de ligne
if debug: print branche_courante+'\t'+branche_courante
# on ecrit pere et fils dans le fichier_destination
# fichier_destination.write(branche_courante+'\t'+branche_courante)
ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne

fichier_source.close()


il ne te reste plus qu'à gérer le fichier destination ;)

 • Re: Structure Pere Fils Arborescence

Posté par glickind le 10/05/2008 01:39
attention, je reposte car les variables entre crochets ont été interprétées comme des balises de mise en page
et donc le code n'a pas été correctement affiché
(il suffit de rajouter un espace après un crochet ouvrant)

code:
def generation(ligne_en_liste):
    generation=0 # pas trouvee
    for i in range(1,len(ligne_en_liste)):
        if ligne_en_liste[i]:  # si l'element est non vide
            generation=i
            break
    return generation


debug=True
#debug=False

fichier_source=open('arbre.csv','r')
# lecture ligne par ligne
ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne

separateur=','  # le separateur du fichier .csv est souvent ',' ou ';'
ligne_en_liste=ligne.split(separateur) 

# initialisation de la branche_courante
branche_courante=ligne_en_liste # peu importe les valeurs initiales, l'important c'est la taille :)

# ligne suivante
# 1,Eq,,,,,
ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne

ligne_en_liste=ligne.split(separateur)
generation_courante=generation(ligne_en_liste)
branche_courante[generation_courante]=ligne_en_liste[0] # on recupere le no de ligne
if debug: print "branche_courante=[%s]" % branche_courante

ligne=fichier_source.readline()
if debug: print "ligne=[%s]" % ligne
while ligne: # tant qu'on n'est pas a la fin du fichier
    ligne_en_liste=ligne.split(separateur)
    generation_courante=generation(ligne_en_liste)
    branche_courante[generation_courante]=ligne_en_liste[0] # on recupere le no de ligne
    if debug: print branche_courante[generation_courante-1]+'\t'+branche_courante[generation_courante]
    # on ecrit pere et fils dans le fichier_destination
    # fichier_destination.write(branche_courante[generation_courante-1]+'\t'+branche_courante[generation_courante])
    ligne=fichier_source.readline()
    if debug: print "ligne=[%s]" % ligne

fichier_source.close()