J'essaie d'utiliser des variables avec des noms différents dans une boucle for. Avant d'expliquer autre chose, permettez-moi de dire que ceci n'est pas le problème que j'ai. Oui, je crée différentes variables en fonction de l'index de la boucle for, mais je comprends de cela et d'autres ressources comment le faire.

Ce que je ne sais pas faire, c'est comment appeler différentes variables dans la boucle for. Je veux dire quelque chose comme ça:

# pre-defined variables
object_1 = 7
object_2 = 8
object_3 = 51

# create new dictionary
Things = {}

# populate dictionary
for i in range(1,4):
    Things['thing_%d'%i] = object_i

Je sais donc comment créer de nouvelles variables distinctes (en utilisant le dictionnaire Things). Ce que je veux faire, c'est avoir un moyen que, comme on le voit sur la dernière ligne, le programme identifie la variable avec l'index i (object_i) pour l'utiliser dans la définition de l'élément dans le Things dictionnaire thing_i.

Existe-t-il un moyen de le faire sans avoir à écrire une ligne de code distincte pour chaque variable (comme illustré ci-dessous)?

Things['thing_1'] = object_1
Things['thing_2'] = object_2
Things['thing_3'] = object_3

MODIFICATION ET CLARIFICATION MISES À JOUR : la raison pour laquelle je ne peux pas utiliser un dictionnaire pour définir object_1, object_2 et object_3, c'est qu'ils ne sont pas réellement définis dans le script Python. Je dois les appeler à partir d'un fichier Salomé (programme de modélisation 3D) où ils sont indexés en tant que Face_1, Face_2, etc. J'adorerais tout avoir dans les éléments d'un tableau (ce qui élimine le besoin de séparer variables), mais pour ce faire, je dois encore appeler les objets de Salomé. J'ai actuellement un script que j'exécute dans la console Salome Python qui commence comme ceci afin que je puisse accéder aux objets de l'étude Salome:

# Salome testing
import salome
salome.salome_init("C:\Users\Me\Study3.hdf")

import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New(salome.myStudy)

# need to retrieve all objects from that study -----------
go = salome.myStudy.FindObjectByPath("/Geometry")
it = salome.myStudy.NewChildIterator( go )
it.InitEx(True)
while it.More():
    so = it.Value()
    it.Next()
    go = so.GetObject()
    if go:
        #print(so.GetName())
        exec( "%s = go"%so.GetName() )
-1
Johiasburg Frowell 16 juil. 2015 à 20:24

5 réponses

Meilleure réponse

Vous pouvez utiliser la méthode intégrée globals (), qui renverra un dictionnaire de {'object_name':object_value}, de cette façon:

default_value = 0
for i in range(1,4):
    Things['thing_%d'%i] = globals().get('object_%d' % i, default_value)

Le default_value est là au cas où la variable n'existe pas qui retournera default_value au lieu de lever l'exception KeyError

1
Iron Fist 16 juil. 2015 à 17:36

Vous pouvez également essayer de cette manière:

>>> object_1 = 7  
>>> vars()['object_1']
7
0
poke 16 juil. 2015 à 17:33

Vous pouvez utiliser un dictionnaire au lieu des trois variables différentes, avec la clé comme object_i et la valeur comme valeur. Exemple -

objects = {'object_1':7,
           'object_2':8,
           'object_3':51}

Ensuite, vous pouvez accéder aux valeurs du dictionnaire tout comme vous allez créer les clés de votre liste Things -

for i in range(1,4):
    Things['thing_%d'%i] = objects['object_%d'%i]

Ce qui précède serait l'une des meilleures solutions, mais si pour une raison vous ne pouvez pas utiliser le dictionnaire, vous pouvez utiliser la fonction globals() qui renvoie l'espace de noms global (des variables globales) en tant que dictionnaire, puis vous pouvez accéder à vos variables en utilisant cordes. Exemple -

object_1 = 7
object_2 = 8
object_3 = 51

# create new dictionary
Things = {}
gbl = globals()
# populate dictionary
for i in range(1,4):
    Things['thing_%d'%i] = gbl['object_%d'%i]
0
Anand S Kumar 16 juil. 2015 à 17:31

Ce qui suit est l'un des moyens de faire ce que vous voulez faire

object_1 = 7
object_2 = 8
object_3 = 51

Things = {}

for i in range(1,4):
    Things['thing_%d'%i] = globals()['object_%d'%i]
1
Anuj 16 juil. 2015 à 17:55

Vous pouvez parcourir les valeurs de ces variables:

variables = (object_1, object_2, object_3)

Things = {}
for i, value in enumerate(variables):
    Things['thing_%d' % i] = value

À ce stade, vous pouvez également utiliser une compréhension de dictionnaire:

Things = { 'thing_%d' % i: value for i, value in enumerate(variables) }

Mais accéder aux variables de manière dynamique, sans les spécifier au préalable, est généralement une mauvaise idée et un signe d'une mauvaise conception. Vous devez alors modifier la façon dont ces variables sont créées en premier lieu.

1
poke 16 juil. 2015 à 17:30