2010-10-24 15 views
44

¿Hay alguna manera de que pueda generar nombres de variables en python en un bucle y asignarles valores? Por ejemplo, si tengogenerando nombres de variables en fly en python

prices = [5, 12, 45] 

Quiero

price1 = 5 
price2 = 12 
price3 = 45 

¿Puedo hacer esto en un bucle o algo en lugar de asignar manualmente price1 = prices[0], etc. price2 = prices[1]

Gracias.

EDIT

Mucha gente me sugirió que escribiera una razón para lo requiere. Primero, ha habido momentos en los que he pensado que esto puede ser más conveniente que usar una lista ... No recuerdo exactamente cuándo, pero creo que he pensado en usar esto cuando hay muchos niveles de anidación. Por ejemplo, si uno tiene una lista de listas de listas, la definición de variables de la manera anterior puede ayudar a reducir el nivel de anidación. En segundo lugar, hoy pensé en esto cuando trato de aprender a usar Pytables. Acabo de encontrar PyTables y vi que al definir la estructura de una tabla, los nombres de columna y tipos se describe de la siguiente manera:

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

Si tengo 100 columnas, escribiendo el nombre de cada columna parece explícitamente un montón de trabajo. Entonces, me pregunto si hay una forma de generar estos nombres de columna sobre la marcha.

+23

¿Por qué quieres hacer eso? – sepp2k

+7

Hombres inventaron listas ... por lo que no tiene que hacer esto. – adamJLev

+0

¡Este es un gran olor a código! ¿Cuál es tu objetivo aquí? ¿Qué vas a hacer con "price94" cuando lo tienes? – PaulMcG

Respuesta

1

por qué quiere ponerlos en Vars por el estilo, que desea consumir más memoria :), por qué no acceder a ellos desde los precios de lista [0], los precios [1] ....

pero lo demonios tal vez esto puede ayudar a

price1, price2, price3 = prices 
+3

Esto no me ayuda porque tengo que escribir físicamente precio1, precio2 y precio3. Algo que me gustaría evitar cuando tengo 100 variables. – Curious2learn

+0

@ Curious2learn: lo siento, ¿a qué te refieres físicamente con el precio 1, ...? ¿estos nombres de vars son ingresados ​​por el usuario o qué ...? actualiza tu pregunta para incluir todos los detalles, gracias :) – mouad

+7

@ curious2learn: cuando tienes 100 variables, y en particular si tienes que asignarlas a foo1 foo2 foo3, significa que no eres un buen codificador, o hay algo realmente, realmente mal en su diseño, o ambos. –

26

Aunque no veo mucho sentido, aquí está:

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

¿Cuál es la sangría del código generado? ¿Y cuándo se genera? No se puede hacer que esto funcione en un proyecto de Django – Philip007

+0

Oh, ¿te refieres a generar código real en lugar de ejecutar cada cosa por separado? Simplemente reemplace ese 'exec()' con un 'print()' luego. –

+0

¿Cuál es el propósito de usar repr()? – Bodhidarma

29

Si realmente quieren crear sobre la marcha se puede asignar a la dict que es devuelto por cualquiera de los factores globales() o loca ls() según en qué espacio de nombres los quiera crear:

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

Pero no recomendaría hacer eso. En general, evita las variables globales. Usar locals() a menudo solo oscurece lo que realmente está haciendo. En cambio, crea tu propio dict y asíndalo.

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

Aprenda the python zen; ejecutar este y asimilar bien:

>>> import this 
+3

asignar a locals() no necesariamente funciona, http://stackoverflow.com/questions/8028708/dynamically-set-local-variable-in-python –

13

sobre un objeto, se puede lograr esto con setattr

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

Otro ejemplo que puede ayudar a alguien algún día:

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

Tengo tu problema , y aquí está mi respuesta:

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]) 

así que mientras la impresión:

price1 = 5 
price2 = 12 
price3 = 45 
+2

Esto no funciona. –

+0

Aquí hay varios errores, pero el enfoque como tal no está completamente dañado; * puedes * asignar 'vars() [" precios "+ str (i)]' y tener una variable con el nombre esperado. – tripleee

1

poco largo, funciona supongo ...

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]) 
Cuestiones relacionadas