IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Créer un arbre "dynamique"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut Créer un arbre "dynamique"
    Bonjour,

    Je souhaiterai créé un arbre "dynamiquement" et ne sais pas trop comment m'y prendre.
    Mon but est de modéliser une forêt en partant des éléments les plus gros, jusqu'au plus fin, sans savoir à l'avance leur nombre.
    Je m'explique, je commence pas définir les arbres et leurs attributs propre, puis leurs branches, puis les feuilles etc...

    Pour cela j'ai pensé créé des classes pour chacun des éléments et faire des liens entre elles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class arbre:
    	def __init__(self,nb_de_branche):
    		self.carac1 = 1
    		self.carac2 = 1
                    self.branche = branches() # probleme : comment cree x branche et qu'on puisse recuperer facilement leurs attributs
     
    class branche:
    	def __init(self):
    		self.carac11 = 11
    		self.carac22 = 22
    Mon but est ensuite de pouvoir accéder simplement aux éléments de chaque arbre depuis le main, puis faire quelque chose de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    baobab = arbre(8)
    A = MaFonction(baobab.branche5.carac11, baobab.carac2) #on prend en argument de fonction des caracteristique de l'arbre et de sa branche numero 5
    J'ai essayé avec un dictionnaire mais je ne vois pas comment récupérer simplement ensuite les caractéristiques qui m'intéressent (dans une boucle en changeant de branche).
    J'ai essayé aussi avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class arbre:
    	def __init__(self,nb_de_branche):
    		self.carac1 = 1
    		self.carac2 = 1
    		for i in range(nb_de_branche):
    			name = 'self.branche{}'.format(i+1)
    			value = branches()
    			locals()[name] = value
    Mais ça ne marche pas.

    De même, je ne vois pas trop comment avoir ensuite un nom de variable qui change d'indice dans une boucle for dans mon main

    Pouvez m'indiquer s'il y a une meilleur manière de faire ou comment résoudre mon problème?

    Merci d'avance !

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Par défaut
    Salut!
    J'ai pas tout saisi en fait. Ce que tu veux c'est modéliser un arbre, qui contient des branches, qui contiennent des feuilles ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class arbre:
    	def __init__(self,nb_de_branches):
    		self.carac1 = 1
    		self.carac2 = 1
                    self.branche = [None]+[branche() for i in range(nb_de_branches)] # Pour ajuster les indices on met un None
     
    class branche:
    	def __init__(self):
    		self.carac11 = 11
    		self.carac22 = 22
     
     
    baobab = arbre(8)
    A = MaFonction(baobab.branche[5].carac11, baobab.carac2) #Ca devrait fonctionner
    Ça devrait marcher comme cela. Mais bon je vois pas trop l’intérêt personnellement, tes arbres vont tous avoir les mêmes caractéristiques, comme tes branches. Et si tu veux rajouter des feuilles à tes branches tu devras indiquer le nombre de feuilles de chaque branche quand tu vas instancier un arbre bref..
    Et pour ton nom de variable qui chance d'indice on appelle cela une liste

  3. #3
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    Je ne m'occupe pas du fond mais de ça :

    Citation Envoyé par plaxtor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.branche = [None]+[branche() for i in range(nb_de_branches)] # Pour ajuster les indices on met un None
    Ou bien c'est particulièrement finaud et astucieux dans ce contexte et ça m'échappe complètement (faudra m'expliquer !) ou c'est un très mauvais conseil !!!

    Python, comme de très nombreux langages, a des indices qui commencent à 0 ! Il faut faire avec car tout est fait pour travailler de la sorte !!

    Sinon, si l'on colle, à la mano, un None à l'indice 0, le nombre vrai d'éléments d'une liste deviendra len(liste)-1 et non plus len(liste), et pour boucler on aura des trucs du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in range(1, len(liste)):
       ...
     
    for elt in liste[1:]:
       ...
    Je ne parle même pas des tranches ou des indices négatifs.

    Plus personne n'y comprendra plus rien : bref, un beau bordel !!!

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Par défaut
    Oui c'est un mauvais conseil et j'en ai conscience !! C'est juste que dans son dernier bout de code j'ai remarqué qu'il voulait que branche1 = branche[1] soit sa première branche, j'ai donc respecté au mieux son choix de programmation, qui n'est pas forcément le meilleur si il compte faire comme tu le dis des boucles etc. Mais pour la façon dont il l'utilise dans MyFonction j'ai jugé que cela était plus pratique. Jugement tout à fait discutable..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class arbre:
    	def __init__(self,nb_de_branches):
    		self.carac1 = 1
    		self.carac2 = 1
                    self.branche = [branche() for i in range(nb_de_branches)] #La 5è branche sera branche[4] !
     
    class branche:
    	def __init__(self):
    		self.carac11 = 11
    		self.carac22 = 22
     
     
    baobab = arbre(8)
    A = MaFonction(baobab.branche[4].carac11, baobab.carac2)

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    Alors tout d'abord, en effet, il vaut mieux faire commencer l'indice à 0, c'est une erreur de ma part en tapant rapidement ce bout de code pour illustrer mon problème.

    Ensuite, les branches etc seront définis à partir de fichiers rentrés en argument ou on ira récupérer les caractéristiques, afin justement d'éviter d'avoir des arbres identiques avec les mêmes caractéristiques et d'avoir à rentrer le nombre de feuilles de chaque branche quand je vais instancier un arbre. Le but c'est d'avoir une structure générale pour chaque élément, et ensuite de pouvoir remplir toutes les caractéristiques automatiquement et d'y accéder facilement.

    plaxtor merci pour ta solution je n'y avais pas pensé, ça fonctionne !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] "Impossible de créer le handle de fenêtre"
    Par cedric_g dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/04/2006, 12h49
  2. [xsl]simuler le mecanisme OO de "liaison dynamique"
    Par philemon_siclone dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 19/12/2003, 11h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo