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 :

Récupération itérative de dictionnaire


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 23
    Points : 26
    Points
    26
    Par défaut Récupération itérative de dictionnaire
    Bonjour!

    Je souhaiterais faire passer des dictionnaires d'une méthode à une autre dans une même classe. Je n'arrive pas à transférer mes dictionnaires corretement, ou du moins pas complétement. J'utilise une methode __init__ pour lire un fichier externe (appelé decay.dat). A partir de decay.dat, j'obtiens N dictionnaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import os
    import sys
    import re 
     
    class DecayParser():
     
      def __init__(self, inputFiles):
         ... #je parse les éléments à partir de mon fichier externe vers des listes, et je transforme ces listes en dictionnaires
         print self.isotopeDecay
     
      def modifyValues(self):
        print self.isotopeDecay
     
    decay_parser = DecayParser('decay.dat') 
    decay_parser.modifyValues()
    Le dictionnaire à ligne 10 ressemble à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print self.isotopeDecay
    {'Er168': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Yb168': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Tm169': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Er170': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Yb170': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Tm171': ['1.144E-08', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Yb171': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    {'Yb172': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    la ligne 13 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print self.isotopeDecay
    {'Yb172': ['0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00', '0.000E+00']}
    Voila mon premier problème, je n'obtiens que le dernier dictionnaire issu de ma première méthode __init__. Je souhaiterais pouvoir utiliser ma méthode modifyValues sur tous les dictionnaires que j'ai obtenu dans __init__. En résumé, voilà mes questions:

    1- Y a-t-il un moyen de passer mes dictionnaires directement de ma méthode __init__ vers modifyValues, ou suis-je obligé de repasser par le main? En d'autres termes, suis-je obligé d'appeler ma fonction modifyValues a la ligne 16 (dans le main) ou puis-je l'appeler immediatement dans __init__?

    2- Si la réponse à la question 1- est non -- i.e. je peux passer mes dictionnaires directement de __init__ vers modifyValues, suis-je obligé de mettre mes dictionnaires dans un (unique) tuple, et envoyé ce tuple de __init__ vers main, puis de main vers modifyValues? En l'état des choses, je n'arrive à récupérer qu'un seul dictionnaire (le dernier) dans modifyValues. En d'autres termes, quel est le meilleur moyen de passer tous mes dictionnaires d'une méthode à l'autre?


    Merci de votre aide!

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Tu n'as pas besoin de passer ton dictionnaire puisqu'il est attribut de l'instance.

    Tu ne montres pas le contenu de la méthode __init__ mais j'aurais tendance à croire que ton print est dans une boucle et donc t'affiche toutes les valeurs mais, en finale, isotopeDecay réfère le dernier dictionnaire créé.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par pascaloupsu Voir le message
    Je souhaiterais faire passer des dictionnaires d'une méthode à une autre dans une même classe. Je n'arrive pas à transférer mes dictionnaires corretement, ou du moins pas complétement. J'utilise une methode __init__ pour lire un fichier externe (appelé decay.dat). A partir de decay.dat, j'obtiens N dictionnaires.
    N dictionnaires, c'est éventuellement construire une liste de dictionnaire ou un seul dictionnaire avec plusieurs clefs.
    A partir de là, la variable/attribut isotopeDecay contiendra autre chose que le N-ième dictionnaire.

    Citation Envoyé par pascaloupsu Voir le message
    En d'autres termes, suis-je obligé d'appeler ma fonction modifyValues a la ligne 16 (dans le main) ou puis-je l'appeler immediatement dans __init__?
    C'est votre choix: rien ne vous oblige... après il faut le faire fonctionner (et cela demande de l'apprentissage).

    - W

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    oui ma fonction __init__ resssemble a cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      def __init__(self, inputFiles):
        self.inputFiles = inputFiles 
        ... 
        for line in lines:
          if re.match(r'(.*?)\s+\D+(-?)\d+\s+\d', line):
            self.isotopeDecay = {}
            SplitString = line.split()
            key, value =  SplitString[0], SplitString[1:]
            self.isotopeDecay[key] = value
            print self.isotopeDecay
    Au final, comment puis-je travailler avec ces dictionnaires dans ma fonction modifyValues? Je n'arrive pas à (1) placer mes dictionnaires dans une liste ou les transformer en un seul dictionnaire avec plusieurs cles et (2) transférer cette nouvelle liste ou nouveau dictionnaire vers ma méthode modifyValues. Avez-vous des pistes pour m'aider s'il vous plait?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par pascaloupsu Voir le message
    Avez-vous des pistes pour m'aider s'il vous plait?
    Relisez votre code: ligne 6: self.isotopeDecay = {} assigne un dictionnaire vide à chaque itération. Donc en sortie, difficile d'espérer y trouver autre chose que le dernier dictionnaire contenant la dernière ligne du fichier.

    Si vous n'arrivez pas à relire votre code pour y trouver une bourde aussi simple... passer du temps à faire des exercices avec les tutos est une étape nécessaire car vous devez comprendre ce que vous demandez à Python de faire.... Et avoir acquis rigueur et esprit logique pour chercher la cause/bourde que vous avez bien pu écrire s'il ne fait pas ce que vous vouliez.

    - W

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Erreur bête, je m'excuse -- même pas implicable à mon manque d'experience en Python. Mais merci tout de même, je ne questionnais même plus les quelques lignes que j'avais et continuais à chercher à l'exterieur des solutions, j'aurais pu y passer encore quelques heures sans voir celà.

    Maintenant que nous y sommes, autant poster quelque chose qui à une valeur ajouté (pédagogiquement parlant):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class DecayParser():
    
        def modifyValues(self):
           print self.isotopeDecay  ### renvoie  la ligne  self.isotopeDecay[key] = value de la methode __init__
           #print("modify file")
    
        def __init__(self, inputFiles):
           ...
           self.isotopeDecay[key] = value
    
    
    decay_parser = DecayParser 
    decay_parser.modifyValues()

    Y a-t-il un moyen direct d'obtenir self.isotopeDecay dans modifyValues à partir de __init__ sans utiliser la ligne 12 du code ci-dessus?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par pascaloupsu Voir le message
    Y a-t-il un moyen direct d'obtenir self.isotopeDecay dans modifyValues à partir de __init__ sans utiliser la ligne 12 du code ci-dessus?
    C'est quoi ce charabia?
    Lorsque modifyValues sera appelée, elle récupérera dans l'attribut isotopeDecay, ce qu'__init__ aura bien voulu y mettre... Et comme c'est la ligne 12 (modulo les parenthèses manquantes) qui provoquera l'appel d'__init__ pas facile de faire sans...

    - W

Discussions similaires

  1. [Python 3.X] Problème récupération valeur dictionnaire
    Par Nqirod dans le forum Général Python
    Réponses: 2
    Dernier message: 28/05/2017, 20h00
  2. [VB]erreur à la récupération d'une valeur d'un dictionnaire
    Par amelhog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/02/2006, 12h06
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. récupération d'images
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/08/2002, 18h36
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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