2010-10-24 13 views
44

Y a-t-il un moyen de générer des noms de variables en python dans une boucle et de leur assigner des valeurs? Par exemple, si jegénérer des noms de variables à la volée en python

prices = [5, 12, 45] 

Je veux

price1 = 5 
price2 = 12 
price3 = 45 

Puis-je faire cela dans une boucle ou quelque chose au lieu d'assigner manuellement price1 = prices[0], price2 = prices[1] etc.

Merci.

EDIT

Beaucoup de gens ont suggéré que j'écris une raison pour exiger cela. Tout d'abord, il y a eu des moments où j'ai pensé que cela serait plus pratique que d'utiliser une liste ... Je ne me souviens pas exactement quand, mais je pense avoir pensé à l'utiliser quand il y a plusieurs niveaux d'imbrication. Par exemple, si on a une liste de listes de listes, la définition des variables de la manière ci-dessus peut aider à réduire le niveau d'imbrication. Deuxièmement, aujourd'hui, j'ai pensé à cela en essayant d'apprendre à utiliser Pytables. Je viens de tomber sur Pytables et j'ai vu que lors de la définition de la structure d'une table, les noms de colonnes et types sont décrits de la manière suivante:

class TableFormat(tables.IsDescription): 
    firstColumnName = StringCol(16) 
    secondColumnName = StringCol(16) 
    thirdColumnName = StringCol(16) 

Si j'ai 100 colonnes, en tapant le nom de chaque colonne semble explicitement beaucoup de travail. Donc, je me demandais s'il y avait un moyen de générer ces noms de colonnes à la volée.

+23

Pourquoi voudriez-vous faire cela? – sepp2k

+7

Les hommes ont inventé des listes .. donc vous n'avez pas à le faire. – adamJLev

+0

Ceci est une odeur de code majeur! Quel est votre objectif ici? Qu'allez-vous faire avec "price94" quand vous l'avez? – PaulMcG

Répondre

1

pourquoi vous voulez les mettre dans vars comme ça, vous voulez consommer plus de mémoire :), pourquoi ne pas les accès de la liste des prix [0], prix [1] ....

mais ce l'enfer peut-être cela peut vous aider

price1, price2, price3 = prices 
+3

Cela ne m'aide pas parce que je dois physiquement taper price1, price2 et price3. Quelque chose que je voudrais éviter quand j'ai 100 variables. – Curious2learn

+0

@ Curious2learn: désolé, que voulez-vous dire physiquement type price1, ...? est-ce que ces noms de vars sont entrés par l'utilisateur ou quoi ...? mettez à jour votre question pour inclure tous les détails, merci :) – mouad

+7

@ curious2learn: quand vous avez 100 variables, et en particulier si vous devez les assigner à foo1 foo2 foo3, cela signifie que vous n'êtes pas un bon codeur, ou qu'il y a vraiment quelque chose, vraiment mal dans votre conception, ou les deux. –

26

bien que je ne vois pas beaucoup, la voici:

for i in xrange(0, len(prices)): 
    exec("price%d = %s" % (i + 1, repr(prices[i]))); 
+0

Quelle est l'indentation du code généré? Et quand est-il généré? Impossible de faire fonctionner ceci dans un projet Django – Philip007

+0

Oh, vous voulez dire générer du code réel plutôt que d'exécuter chaque chose? Remplacez simplement 'exec()' par un 'print()' alors. –

+0

Quel est le but de l'utilisation de repr()? – Bodhidarma

29

Si vous voulez vraiment les créer à la volée, vous pouvez attribuer à la dict qui est retourné par globals() ou loca ls() en fonction de l'espace de noms dans lequel vous voulez les créer:

globals()['somevar'] = 'someval' 
print somevar # prints 'someval' 

Mais je ne le recommanderais pas. En général, évitez les variables globales. L'utilisation locale() souvent obscurcit ce que vous faites vraiment. Au lieu de cela, créez votre propre dict et attribuez-le.

mydict = {} 
mydict['somevar'] = 'someval' 
print mydict['somevar'] 

Apprenez le python zen; exécuter ce et assimilez bien:

>>> import this 
+3

l'affectation aux locaux() ne fonctionne pas nécessairement, http://stackoverflow.com/questions/8028708/dynamically-set-local-variable-in-python –

13

Sur un objet, vous pouvez y parvenir avec setattr

>>> class A(object): pass 
>>> a=A() 
>>> setattr(a, "hello1", 5) 
>>> a.hello1 
5 
6

Un autre exemple qui peut aider quelqu'un à jour:

>>> vr={} 
... for num in range(1,4): 
...  vr[str(num)] = 5 + num 
...  
>>> print vr["3"] 
8 
>>> 
7

Je suis votre problème , et voici ma réponse:

prices = [5, 12, 45] 
list=['1','2','3'] 

for i in range(1,3): 
    vars()["prices"+list[0]]=prices[0] 
print ("prices[i]=" +prices[i]) 

donc en cours d'impression:

price1 = 5 
price2 = 12 
price3 = 45 
+2

Cela ne fonctionne pas. –

+0

Il y a plusieurs bugs ici, mais l'approche en tant que telle n'est pas complètement erronée; vous pouvez * assigner 'vars() [" prices "+ str (i)]' et avoir une variable avec le nom attendu. – tripleee

1

peu long, ça marche, je suppose ...

prices = [5, 12, 45] 
names = [] 
for i, _ in enumerate(prices): 
    names.append("price"+str(i+1)) 
dict = {} 
for name, price in zip(names, prices): 
    dict[name] = price 
for item in dict: 
    print(item, "=", dict[item]) 
Questions connexes