2009-06-29 14 views
18

Me preguntaba si alguien sabía de una manera de cambiar los nombres de variables con sede fuera de un bucle for para algo como esto:Cambio de nombres de variables con Python para bucles

for i in range(3) 
    group+i=self.getGroup(selected, header+i) 

para que los nombres de las variables del cambio para acomodar los datos. ¡Gracias!

~ Sam

+3

¿Cuál sería el punto de cambiar el nombre de la variable? –

Respuesta

2

Parece que desea utilizar una lista en su lugar:

group=[] 
for i in range(3): 
    group[i]=self.getGroup(selected, header+i) 
+3

¿Quiere decir "Diccionario" o "Lista"? ¿Qué es una matriz? –

+1

Me refiero a la lista, gracias. He llamado colecciones ordenadas de "arreglos" de elementos durante mucho tiempo, y nunca he usado PHP en el que usurparon el término para significar "matriz asociativa". –

34

Es posible que desee un diccionario en lugar de las variables independientes. Por ejemplo

d = {} 
for i in range(3): 
    d["group" + str(i)] = self.getGroup(selected, header+i) 

Si usted insiste en tener que modificar las variables locales, se puede utilizar la función locals:

for i in range(3): 
    locals()["group"+str(i)] = self.getGroup(selected, header+i) 

Por otro lado, si lo que realmente quiere es modificar las variables de instancia de la clase que se encuentre, a continuación, puede utilizar la función de setattr

for i in group(3): 
    setattr(self, "group"+str(i), self.getGroup(selected, header+i) 

Y, por supuesto, estoy asumiendo con todos estos ejemplos que usted no sólo queremos una lista:

groups = [self.getGroup(i,header+i) for i in range(3)] 
-1

Usted podía __dict__ atributo acceso de su clase:

for i in range(3) 
    self.__dict__['group%d' % i]=self.getGroup(selected, header+i) 

Pero ¿por qué no puede usted sólo tiene que utilizar una matriz llamada group?

+1

En lugar de usar self .__ dict __ [etc], querrá usar setattr (self, etc), y estoy seguro de que quiso decir 'list' en lugar de 'array'. Buen uso del formato de cadenas sin embargo. – tgray

7

Use una lista.

groups = [0]*3 
for i in xrange(3): 
    groups[i] = self.getGroup(selected, header + i) 

o más "Pythonically":

groups = [self.getGroup(selected, header + i) for i in xrange(3)] 

Por lo que vale la pena, que podría tratar de crear las variables de la forma "errónea", es decir, mediante la modificación del diccionario que mantiene sus valores:

l = locals() 
for i in xrange(3): 
    l['group' + str(i)] = self.getGroup(selected, header + i) 

pero esa es una forma realmente mala, y posiblemente ni siquiera garantizada para funcionar.

1

Definitivamente debería usar un dict usando la clave "group" + str (i) como se describe en la solución aceptada, pero quería compartir una solución usando exec. Es una manera de analizar cadenas en los comandos & ejecutarlos dinámicamente. Permitiría crear estos nombres de variables escalares según su requerimiento en lugar de usar un dict. Esto podría ayudar en lo que no debe hacer, y solo porque usted no puede significar que debe hacerlo. Es una buena solución sólo si el uso de variables escalares es un requisito duro:

l = locals() 
for i in xrange(3): 
    exec("group" + str(i) + "= self.getGroup(selected, header + i)") 

Otro ejemplo donde esto podría funcionar usando un ejemplo de modelo de Django.La solución alternativa Exec está comentada y la mejor manera de manejar este caso mediante el dict atributo tiene más sentido:

Class A(models.Model): 

    .... 

    def __getitem__(self, item): # a.__getitem__('id') 
     #exec("attrb = self." + item) 
     #return attrb 
     return self.__dict__[item] 

Podría tener más sentido para extenderse desde un diccionario en el primer lugar para obtener setattr y funciones getattr.

Una situación que implica el análisis, por ejemplo, la generación de & ejecución de comandos de python de forma dinámica, exec es lo que quiere :) Más sobre el ejecutor here.

Cuestiones relacionadas