¿Cómo se crean diferentes nombres de variables en un ciclo? [duplicar]

125

Por ejemplo ...

for x in range(0,9):
    string'x' = "Hello"

Así que termino con string1, string2, string3 ... todo igual a "Hola"

Takkun
fuente
34
La respuesta es que no quieres hacer esto. Use una lista en su lugar.
Sven Marnach
2
Si es aquí donde quiere usarlo, puede tener x = ["Hello" * 9]acceso a él x[0], x[1] ...si desea usarlo de una manera diferente, creo que tendrá que darnos un poco más de código de fondo.
James Khoury
3
Si alguna vez tengo poder sobre un idioma, usar números en nombres de variables me dará SyntaxError: Use a data structure.;-)
Jochen Ritzel
1
y no olvides tu string0;)
wim
10
@ James Khoury: Eso no está del todo bien. Eso terminaría xsiendo una lista que contiene un único elemento: la cadena "HelloHelloHelloHelloHelloHelloHelloHelloHello". Creo que quisiste decir x = ["Hello"] * 9.

Respuestas:

162

Seguro que puede; se llama diccionario :

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"
>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

Dije esto de alguna manera bajo control, pero realmente la mejor manera de asociar un valor con otro valor es un diccionario. ¡Para eso fue diseñado!

el lobo
fuente
62

Es realmente una mala idea, pero ...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

y luego por ejemplo:

print(string3)

Te regalaré:

Hello

Sin embargo, esta es una mala práctica. En su lugar, debe usar diccionarios o listas, como otros proponen. A menos, por supuesto, que realmente quisieras saber cómo hacerlo, pero no quisieras usarlo.

Tadeck
fuente
2
¿Puedes explicar por qué es una mala idea?
ajdigregorio
66
@paintedcones: Primero, debería haber una forma de hacerlo , y usar diccionarios simples es más natural. En cambio, usar el diccionario global es una mala idea, porque también "implícitamente" crea variables globales o las modifica. Dado que tanto la configuración como la modificación de variables de esta manera requieren notación de diccionario, no hay razón para usar en globals()lugar de algunas simples dict.
Tadeck
Hay algunas situaciones en las que necesita hacer un montón de variables, x1, x2, x3, etc. Pero en la mayoría de las situaciones, usar un diccionario es lo más apropiado.
DevilApple227
20

Una forma de hacerlo es con exec(). Por ejemplo:

for k in range(5):
    exec(f'cat_{k} = k*2')
>>> print(cat_0)
0
>>> print(cat_1)
2
>>> print(cat_2)
4
>>> print(cat_3)
6
>>> print(cat_4)
8

Aquí estoy aprovechando el práctico formato de cadena f en Python 3.6+

Collin W.
fuente
55
Recuerde execalgo, magia negra, vulnerabilidades de ataque, cosas malas, pero responde la pregunta tal como se le preguntó.
psaxton
18

Simplemente no tiene sentido crear nombres de variables variables. ¿Por qué?

  • No son necesarios: puede almacenar todo en listas, diccionarios, etc.
  • Son difíciles de crear: tienes que usar execoglobals()
  • No puede usarlos: ¿cómo se escribe el código que usa estas variables? Tienes que usar de exec/globals()nuevo

Usar una lista es mucho más fácil:

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them
Jochen Ritzel
fuente
¡¡Gracias!! Necesitaba elegir el formulario entre el diccionario o la lista de marcos de datos. Y dado que necesitaba reordenar el marco de datos basado en un cierto valor en el marco de datos, no podría haber usado el formulario de diccionario. ¡Si, tienes razón! ¡En algunos casos es realmente inútil crear nombres de variables!
Doo Hyun Shin
9

No hagas esto usa un diccionario

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

no hagas esto usa un dict

globals () tiene riesgo ya que le da a lo que apunta el espacio de nombres actualmente, pero esto puede cambiar y, por lo tanto, modificar el retorno de globals () no es una buena idea

Aaron Goldman
fuente
8
for x in range(9):
    exec("string" + str(x) + " = 'hello'")

Esto debería funcionar.

Abhishek Rai
fuente
3

Yo usaría una lista:

string = []
for i in range(0, 9):
  string.append("Hello")

De esta manera, tendría 9 "Hola" y podría obtenerlos individualmente de esta manera:

string[x]

Dónde xidentificaría qué "Hola" quieres.

Entonces, print(string[1])imprimiría Hello.

Lledargo
fuente
1
A diferencia de algunos lenguajes, no puede asignar elementos en una lista de Python que aún no existan (obtendrá un error de "índice de asignación de lista fuera de rango"). Es posible que desee utilizar string.append("Hello")en su lugar.
Greg Hewgill
1
Debería haberlo sabido, gracias por recordármelo. Está arreglado.
Lledargo
A la derecha, estaba pensando en agregar al final de una cadena, no agregar a una matriz. Mis disculpas a todos.
Lledargo
Pendientemente 'tendrías 9 "Hola"' debería ser 'tendrías 1 "Hola" 9 veces ". Es la misma cadena repetida, no nueve cadenas de diferencia.
Duncan
2

Creo que el desafío aquí no es recurrir a global ()

Definiría personalmente una lista para sus variables (dinámicas) que se mantendría y luego la agregaría dentro de un ciclo for. Luego use un bucle for separado para ver cada entrada o incluso ejecutar otras operaciones.

Aquí hay un ejemplo: tengo varios conmutadores de red (digamos entre 2 y 8) en varias sucursales. Ahora necesito asegurarme de tener una manera de determinar cuántos conmutadores están disponibles (o prueba de ping activo) en cualquier rama y luego realizar algunas operaciones en ellos.

Aquí está mi código:

import requests
import sys

def switch_name(branchNum):
    # s is an empty list to start with
    s = []
    #this FOR loop is purely for creating and storing the dynamic variable names in s
    for x in range(1,8,+1):
        s.append("BR" + str(branchNum) + "SW0" + str(x))

    #this FOR loop is used to read each of the switch in list s and perform operations on
    for i in s:
        print(i,"\n")
        # other operations can be executed here too for each switch (i) - like SSH in using paramiko and changing switch interface VLAN etc.


def main():  

    # for example's sake - hard coding the site code
    branchNum= "123"
    switch_name(branchNum)


if __name__ == '__main__':
    main()

Salida es:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

Cumar Chan
fuente
2

El uso de diccionarios debe ser la forma correcta de mantener las variables y los valores asociados, y puede usar esto:

dict_ = {}
for i in range(9):
     dict_['string%s' % i]  = 'Hello'

Pero si desea agregar las variables a las variables locales, puede usar:

for i in range(9):
     exec('string%s = Hello' % i)

Y, por ejemplo, si desea asignarles valores del 0 al 8, puede usar:

for i in range(9):
     exec('string%s = %s' % (i,i))
Ashkan Mirzaee
fuente
0

El diccionario puede contener valores y los valores se pueden agregar utilizando el método update (). Desea que su sistema cree variables, por lo que debe saber dónde guardar.

variables = {}
break_condition= True # Dont forget to add break condition to while loop if you dont want your system to go crazy.
name = variable
i = 0 
name = name + str(i) #this will be your variable name.
while True:
    value = 10 #value to assign
    variables.update(
                  {name:value})
    if break_condition == True:
        break
Ogibalboa
fuente