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 :

Comment "Appeler" une liste grâce à une chaine string sélectionnée ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    Octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2022
    Messages : 12
    Par défaut Comment "Appeler" une liste grâce à une chaine string sélectionnée ?
    Bonjour à toutes et tous,

    Malgré deux journées de recherche intensive et de tentatives de bidouillage, je m'en remets à vos conseils.

    Dans un script me permettant de réaliser des calculs complexes en peu de temps, j'ai créer, dans une class appelée isotop, une listes par isotope radioactif avec à l'intérieur de la liste des valeurs nécessaire à les calculs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        fluor18=[3.52e18,6588,0,511,0,0,1.94,0,0]
        chlore38=[4.92e18,22320,1.642,2.168,0,0.33,0.44,0]
        scandium46=[1,25e15,7240320,0.889,1.121,0,1,1,0]
        scandium48=[5.53e16,157248,0.984,1.038,1.312,1,0.98,1]
        cobalt60=[4.18e13,166194720,1.173,1.333,0,1,1,0]
        iridium192=[3.41e14,6376320,0.317,0.468,0.604,0.83,0.48,0.08]
        thallium204=[1.71e13,119206080,0.069,0,0,1,0,0]
        cesium137=[3.20e12,949233600,0.032,0.036,0.662,0.06,0.01,0.85]
        iode131=[4.61e15,691200,0.284,0.365,0.637,0.06,0.82,0.07]
        strontium85=[8.75e14,5607360,0.013,0.015,0.514,0.5,0.08,0.99]
        lutetium177m=[1.69e14,13858560,0.328,0.379,0.419,0.18,0.28,0.20]
    Pour sélectionner un isotope, j'ai créé une liste avec le nom des isotopes afin de renseigner une combobox qui me retourne la sélection de l'utilisateur en chaine str.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isotopes=["fluor18","Chlore38","Scandium46","Scandium48","Cobalt 60","Iridium 192","Thallium 204","Cesium 137","Iode 131","Strontium 85","Lutétium 177m"]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        selection_isotope_ded1m = StringVar()
        selection_isotope_ded1m.set("...")
        Combobox(page_ded1m,values=isotop.isotopes,textvariable=selection_isotope_ded1m).grid(row=1,column=0)
    Suite à cette sélection en string, je me tape une multitude de if et elif pour sélectionner les valeurs contenue dans la liste correspondante à l'isotope.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            if str_selection_isotope_ded1m == isotop.isotopes[0]:
     
                e1=isotop.fluor18[2]
                e2=isotop.fluor18[3]
                e3=isotop.fluor18[4]
                q1=isotop.fluor18[5]
                q2=isotop.fluor18[6]
                q3=isotop.fluor18[7]
                affichage_calcul()
    Afin d'arrêter de coder des elif à chaque fois que je rajoute un isotope, je souhaiterai "appeler directement" le contenu de la liste via la chaine string de la combobox.

    Du style ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           str_selection_isotope_ded1m
    
                e1=isotop.str_selection_isotope_ded1m[2]
                e2=isotop.str_selection_isotope_ded1m[3]
                e3=isotop.str_selection_isotope_ded1m[4]
                q1=isotop.str_selection_isotope_ded1m[5]
                q2=isotop.str_selection_isotope_ded1m[6]
                q3=isotop.str_selection_isotope_ded1m[7]
                affichage_calcul()
    Bien sûr, le dernier code ne fonctionne pas sinon je ne serai pas là..

    J'ai naturellement essayé de contourner le souci avec index() mais je n'ai pas réussi et surtout je suis persuadé qu'une syntaxe simple doit exister...

    Dans l'espoir d'avoir été clair et que vous ayez une solution à l'optimisation de mon code.

    Je vous remercie.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par judi_cael Voir le message
    ...et surtout je suis persuadé qu'une syntaxe simple doit exister...
    Ben oui, les dictionnaires !!!

    Et les listes figées, ce sont des tuples.

    Code python : 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
    17
    18
    19
    20
    fluor18=(3.52e18,6588,0,511,0,0,1.94,0,0)
    chlore38=(4.92e18,22320,1.642,2.168,0,0.33,0.44,0)
    scandium46=(1,25e15,7240320,0.889,1.121,0,1,1,0)
    scandium48=(5.53e16,157248,0.984,1.038,1.312,1,0.98,1)
    cobalt60=(4.18e13,166194720,1.173,1.333,0,1,1,0)
     
    isotopes={
    	"fluor18" : fluor18,
    	"Chlore38" : chlore38,
    	"Scandium46" : scandium36,
    }
     
    for k in isotopes.keys():
    	print(k, isotopes[k])
     
    for v in isotopes.values():
    	print(v)
     
    for (k, v) in isototopes.items():
    	print(k, v)

    Tu peux même éviter les intermédiaires
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    isotopes={
    	"fluor18" : (3.52e18,6588,0,511,0,0,1.94,0,0),
    	"Chlore38" : (4.92e18,22320,1.642,2.168,0,0.33,0.44,0),
    	"Scandium46" : (1,25e15,7240320,0.889,1.121,0,1,1,0),
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    Octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2022
    Messages : 12
    Par défaut
    Je te remercie !

    Etant débutant, je ne maitrise pas les dictionnaires mais je vais m'y atteler!!

    Pour le tuples, effectivement je confond souvent entre liste et tuple

    Je te remercie pour ton aide rapide, je vais essayer de l'utiliser à bon escient.

    Cordialement.

    Je posterai ma solution

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Etant débutant, je ne maitrise pas les dictionnaires
    Tu maitrises les listes? Tu sais balayer une liste? Rechercher un élément par sa position? Alors tu maitrises les dictionnaires. Simplement dans un dictionnaire on n'a pas des "positions" numériques mais des "clefs" qui peuvent être quasiment n'importe quoi.

    Ici un petit tuto explicatif.

    Citation Envoyé par judi_cael Voir le message
    Pour le tuples, effectivement je confond souvent entre liste et tuple
    C'est simple: un tuple c'est une liste non modifiable. Ou une liste c'est un tuple modifiable.
    Donc si tu n'as pas besoin de modifier une liste, un tuple est plus économe en terme de taille et temps d'accès.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Hello,

    j'ai créer, dans une class appelée isotop
    Je ne vois pas de classe !

    Cependant, en admettant qu'elle est réellement implémentée, encore faut-il qu'elle soit justifiée (ce qui est tout à fait imaginable à mon sens) en implémentant les actions liées à un isotope.
    Peut-être cela est déjà imaginée, et non implémentée, mais si ce n'est pas le cas je vois deux solutions...

    La 1ère étant de créer un module de constantes et d'importer ce module afin d'y récupérer les valeurs des isotopes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import constants
     
    isotop_names = [isotop for isotop in dir(constants) if not isotop.startswith("__")]
     
    print(isotop_names)  # ['cesium137', 'chlore38', 'cobalt60', 'fluor18', 'iode131', 'iridium192', ...]
     
     
    isotop = lambda name: getattr(constants, name, "")
    cesium = isotop("cesium137")
    print(cesium)  # [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]
    La 2ème étant de créer un dictionnaire comme l'indique ci-dessous Sve@r

    La pseudo 3ème solution avec une classe isotope

    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
    17
    18
    19
    from typing import Union
     
    class Isotop:
        def __init__(self, name: str):
            self.__name = name
            self.values: list[Union[int, float]] = []
     
        @property
        def name(self):
            return self.__name
     
        def __str__(self):
            return f"{self.__name}: {self.values}"
     
     
    cesium = Isotop("cesium137")
    cesium.values = [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]
     
    print(cesium)  # cesium137: [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    La 1ère étant de créer un module de constantes et d'importer ce module afin d'y récupérer les valeurs des isotopes
    ...

    La pseudo 3ème solution avec une classe isotope
    Holà Tornado hooo... as-tu noté l'état de "quasi débutant" de notre nouvel ami???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Holà Tornado hooo... as-tu noté l'état de "quasi débutant" de notre nouvel ami???
    Oui c'est fort possible en effet, j'avoue

  8. #8
    Membre habitué
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    Octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2022
    Messages : 12
    Par défaut
    Merci à vous pour vos conseils et effectivement Fred, tu viens de me satelliser !

    J'ai effectivement besoin de récupérer les valeurs indépendamment pour les appliquer dans une formule et j'ai peur que le dictionnaire ne puisse pas le faire..

    La liste est toute indiquée manifestement mais je vais relire encore une trentaine de fois vos messages :-)

    Sinon la classe était juste une manière de les classer, je n'avais pas déf d'__init__.


    Pour une meilleur lecture, je vous partage le code entier par github.

    https://github.com/MJudicael/EASY-CMIR

    Merci encore !

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    et j'ai peur que le dictionnaire ne puisse pas le faire..
    Bien évidemment que si !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    isotopes={
    	"fluor18" : (3.52e18, 6588, 0, 511, 0, 0, 1.94, 0, 0),
    	"Chlore38" : (4.92e18, 22320, 1.642, 2.168, 0, 0.33, 0.44, 0),
    	"Scandium46" : (1,25e15, 7240320, 0.889, 1.121, 0, 1, 1, 0),
    }
    print(isotopes["Clore38"][3] * 2)		# 2*2.168 = 4.336
    Pour le reste ce n'est qu'une question d'itération, de clef et d'index...

    Citation Envoyé par judi_cael Voir le message
    La liste est toute indiquée manifestement mais je vais relire encore une trentaine de fois vos messages :-)
    A la limite tu t'en fouts, c'est juste un détail (pour le puriste, on n'utilise pas de liste quand un tuple suffit). Tu remarqueras aussi l'aération de mon exemple ci-dessus. Un code bien aéré est immédiatement plus lisible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/03/2020, 11h37
  2. [PowerShell] comment faire appelle a une Fonction Powershel
    Par Boubou2020 dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 19/03/2018, 10h33
  3. comment faire appel d'une application java dans un script shell?
    Par moradbe dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 01/02/2007, 19h55
  4. Réponses: 2
    Dernier message: 13/10/2005, 17h46
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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