2011-12-16 9 views
3

Je me demandais s'il existait un moyen d'utiliser un itérateur comme nom de variable dans une boucle Python. Par exemple, si je voulais créer des objets v0, v1, v2, est-il un moyen de faire quelque chose comme ceci:Utiliser l'itérateur comme nom de variable dans la boucle python

for i in range(3): 
    v + str(i) = i**2 

Je sais que la syntaxe est mauvaise, mais l'idée doit être claire. Quelque chose d'équivalent à paste dans R? Merci beaucoup,

+2

Qu'est-ce que cela a à voir avec la question dans votre Titre? Mieux encore, pourquoi voudriez-vous le faire? – NullUserException

+2

Veuillez utiliser une 'liste'. – kennytm

+2

Il existe des façons de le faire, mais vous feriez probablement mieux d'attribuer à une autre liste et d'accéder ensuite à cette liste par index. –

Répondre

6

La méthode intégrée globals() retourne un dictionnaire représentant la table de symboles globale actuelle.

Vous pouvez ajouter une variable à globals comme ceci:

globals()["v" + str(i)] = i**2 

Pour votre information: Ceci est la réponse à votre question, mais certainement pas la méthode recommandée pour aller. La manipulation directe globals est une solution de piratage qui peut surtout être évitée en tant qu'alternative plus propre. (Voir d'autres commentaires sur ce sujet)

+0

+1 parce que cela le résout. Je ne recommanderais pas le faire, mais il le résout. Vous pouvez également faire quelque chose de similaire avec n'importe quel type de tableau associatif, plutôt que simplement le tableau 'globals', bien que vous deviez accéder au tableau pour l'extraire. –

+0

Il y a aussi 'locals()' qui est lié à la portée actuelle. – rrjamie

+2

Je déteste quand les gens fournissent des solutions qui permettent aux gens de faire des choses qu'ils ne devraient pas faire. Je ne sais pas si je devrais critiquer cela pour avoir encouragé une mauvaise idée, ou pas, parce que c'est ce que le PO a demandé. – NullUserException

5

Bien que cela ne tente pas de répondre directement à la question (voir geccos réponse à cette), ce qui est généralement la méthode « approuvé » pour une telle opération:

v = [i**2 for i in range(3)] 

print v[0] # 0 
print v[1] # 1 
print v[2] # 4 

En général, il est à la fois plus propre et plus extensible d'utiliser un ADT (une liste dans ce cas) pour représenter le problème donné que d'essayer de créer des "variables dynamiques" ou des "variables variables".

Bonne codification.


Bien que les utilisations ci-dessus indices, la forme la plus générale des « variables variables » se fait généralement avec un dictionnaire:

names = dict(("v" + str(i), i**2) for i in range(3)) 
print names["v2"] # 4 

Et, pour un fini (et relativement faible) fixe ensemble de variables , "unpacking" peut également être utilisé:

v0, v1, v2 = [i**2 for i in range(3)] 
print v1 # 1 
1

Je préfère xrange() à la plage(). Voici le code pour vous:

for i in xrange(3): 
    exec("v"+str(i)+" = i * i") 

Même si ... vous devriez envisager d'utiliser une liste

0

Il y a quelques façons de faire, le meilleur dépendra de ce que vous voulez vraiment faire avec les variables après les avoir créées.

globals() et locals() fonctionnera mais ils ne sont pas ce que vous voulez. exec() fonctionnera également mais c'est encore pire que globals() et locals().

Une compréhension de la liste comme mentionné par @ user166390 est une bonne idée si v1, v2 et v3 sont homogènes et que vous voulez juste y accéder par index.

>>> v = [i ** 2 for i in range(3)] 
>>> v[0] 
0 
>>> v[1] 
1 
>>> v[2] 
4 

Vous pouvez aussi le faire, si elle est toujours exactement trois éléments:

>>> v1, v2, v3 = [i ** 2 for i in range(3)] 
>>> v1 
0 
>>> v2 
1 
>>> v3 
2 

C'est bien si les objets sont plus individuels parce que vous pouvez leur donner leur propre nom.

Une autre entre-deux option consiste à utiliser un dict:

d = {} 
for i, val in enumerate(range(3)): 
    d["v{}".format(i)] = val 

>>> d["v0"] 
0 
>>> d["v1"] 
1 
>>> d["v2"] 
4 

Ou un raccourci pour ce qui précède à l'aide d'une compréhension dict:

d = {"v{}".format(i): val for i, val in enumerate(range(3))} 
Questions connexes