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 :

incrémenter nom variable


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut incrémenter nom variable
    Bonjour,

    dans un code python (v2.6), j'aimerais pouvoir incrémenter le nom d'une variable.

    J'ai une macro dans laquelle je boucle plusieurs variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for var in var_list:
            for an in range(1950, 2101, 1):
                for mois in range (1, 13, 1):
                    r1 = var+"_"+str(an)+"_1"
                    r2 = var+"_"+str(an)+"_2" 
                    ...
    j'aimerai pouvoir écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r+str(mois) = var+"_"+str(an)+"_"+str(mois)
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    r1 = var+"_"+str(an)+"_1"
    r2 = var+"_"+str(an)+"_2"...
    est-ce possible de faire qqch dans ce genre?
    d'avance merci

    Vincent

  2. #2
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    C'est immédiat avec l'instruction exec ou à partir de Python 3.0 la fonction exec(), je vous laisse regarder la doc.
    Mais c'est crade, peu lisible, et ça perturbe pas mal les outils d'aide au codage.
    C'est un sujet qui revient souvent, il est rare que la bonne solution ne soit pas logiquement la plus simple, à savoir utiliser ce que le langage offre, liste des années, liste des mois, et dictionnaire pour les variables.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il est aussi possible d'écrire dans le namespace, dans se cas un string est suffisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> globals()['a'] = 1
    >>> a
    1
    Mais c'est pas terrible non plus.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ok merci Pierre.
    J'avais vu cette fonction mais elle ne me convient pas vraiment.
    On essaie toujours de traduire littéralement d'autres langages, mais ça ne marche pas toujours bien...
    Vincent

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Une variable, c'est un "nom" dans un dictionnaire globals() ou locals().
    Dans votre cas globals().
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for x in range(10):
         globals()['foo_%d' % x ] = x
    devrait créer les variables foo_0, foo_1,... foo_9 et leur assigner les objets 0, 1, ...9
    Ceci dit plutôt que de structurer un nommage basé sur la segmentation de chaînes de caractères, il est peut être plus judicieux de créer une boîte "foo" de type dict et d'utiliser l'entier comme index/clés:
    foo = {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for x in range(10):
         foo[x] = x
    Note: plutôt qu'adresser le 5ième élément via la variable "foo_4" on fera "foo[4]"...

    Qu'est ce que çà change?
    Si un entier n représente notre numéro de mois, foo[n] permettra de récupérer directement la valeur associée. Ainsi que globals()['foo'][n]. Dans le cas "string", ce sera globals()['foo_%d' % n].

    Reprenons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for var in var_list:
            for an in range(1950, 2101, 1):
                for mois in range (1, 13, 1):
                    r1 = var+"_"+str(an)+"_1"
                    r2 = var+"_"+str(an)+"_2"
    Voilà un joli paquet de 61*12 = 732 boîtes - où seules survivent les 12 dernières... - que l'on peut fabriquer de la façon suivante (avec des dict):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    YEARS = range(1950, 2101, 1)
    MONTHS = range (1, 13, 1)
    BOXES = { y: { m : (y, m) for m in MONTHS } for y in YEARS }
    BOXES[2002][3] est mars-2002 et contient le tuple (2002, 3) - ou autre chose -. BOXES[2002] est l'ensemble des mois de 2002...

    Je ne sais pas pourquoi vous tenez tant à dupliquer les BOXES mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import copy
    for var in var_list:
         globals()[var] = copy.deepcopy(BOXES)
    va, pour chaque noms dans 'var_list' créer la variable et lui associer une copy de BOXES.

    Bon enfin c'est vous qui voyez.
    - W
    PS: Juste pour pousser la balle un peu plus loin que globals()['foo'] = 'bar'
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour toutes vos précisions, je vais regarder tout ça.

    Je ne sais pas pourquoi vous tenez tant à dupliquer les BOXES
    Le principe c'est que je lance un traitement par mois/annee/modele. Le nom de mes fichiers en entrée sont construits en reprenant le nom de ma donnée/année/mois (c'est ce nom de fichier que je stocke dans ma variable python).
    Je fais également des regroupements (moyennes annuelles par exemple) par annee/modele.
    Je n'ai pas forcément des données pour chaque mois, donc je fais des tests systématiques pour savoir si le mois existe et combien de mois ont été traités dans l'année.

    Bon enfin c'est vous qui voyez
    Je vois pas clair, mais je me soigne (enfin j'essaie)!

    Encore merci

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pourquoi ne pas plutôt utiliser une matrice ?
    Exemple sur deux modèles/trois ans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> MONTHS = range (1, 13, 1)
    >>> YEARS = range(1950, 1953, 1)
    >>> MODELS = ('premier', 'deuxieme')
    >>> matrix = [[[0]*len(MODELS) for m in MONTHS] for y in YEARS]
    >>> matrix
    [[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]
    Avec des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> import random
    >>> matrix = [[[random.randrange(0, 10), random.randrange(0, 10)] for m in MONTHS] for y in YEARS]
    >>> matrix
    [[[8, 6], [9, 0], [4, 0], [2, 9], [5, 0], [5, 5], [4, 2], [1, 9], [6, 0], [7, 6], [5, 5], [3, 8]], [[9, 8], [4, 7], [9, 6], [1, 4], [3, 6], [6, 1], [1, 6], [4, 0], [3, 6], [9, 5], [8, 0], [4, 4]], [[9, 5], [9, 1], [1, 2], [6, 9], [4, 2], [7, 4], [5, 4], [4, 9], [0, 3], [5, 5], [7, 6], [0, 1]]]
    >>> for m in range(len(matrix)):
    ...     MODELS[0], 1950+m, matrix[m][0][0]
    ... 
    ('premier', 1950, 8)
    ('premier', 1951, 9)
    ('premier', 1952, 9)
    Comme c'est des listes c'est modifiable à souhait et vous n'avez qu'une référence, celle de la matrice.

    @+

    Edit:

    C'est plus maniable juste avec des listes...
    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
    20
    >>> MODELS = ['premier', 'deuxieme']
    >>> matrix = [[[0]*len(MODELS) for m in MONTHS] for y in YEARS]
    >>> MODELS.append('Troisieme')
    >>> for y in range(len(matrix)):
    ...     for m in range(0, 12):
    ...          matrix[y][m].append(0)
    ... 
    >>> matrix
    [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]
    >>> MODELS.pop()
    'Troisieme'
    >>> for y in range(len(matrix)):
    ...     for m in range(0, 12):
    ...          matrix[y][m].pop()
    ... 
    0
    ........
    0
    >>> matrix
    [[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]
    @++
    Merci d'utiliser le forum pour les questions techniques.

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

Discussions similaires

  1. incrémenter nom de variable
    Par SRVnans dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/06/2015, 12h39
  2. Incrément nom variable
    Par quoi_godard dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 18/06/2013, 16h50
  3. Incrémentation nom variable liste
    Par doulie dans le forum MATLAB
    Réponses: 1
    Dernier message: 07/07/2011, 20h01
  4. Incrémenter nom de variable
    Par pouponsaltro dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/03/2011, 14h43
  5. [MySQL] incrémenter nom de variable
    Par pitxu dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/03/2011, 18h44

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