web-dev-qa-db-fra.com

Comment créer différents noms de variables en boucle?

À titre d'exemple ...

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

Je me retrouve donc avec string1, string2, string3 ... tous égaux à "Hello"

98
Takkun

Sûr que vous pouvez; son appelé un dictionnaire :

d={}
for x in range(1,10):
        d["string{0}".format(x)]="Hello"

In [7]: d["string5"]
Out[7]: 'Hello'

In [8]: d
Out[8]: 
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

Je l'ai dit un peu à contrecœur, mais la meilleure façon d'associer une valeur à une autre est un dictionnaire. C'est ce pour quoi il a été conçu!

128
the wolf

C'est vraiment une mauvaise idée, mais ...

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

et puis par exemple:

print(string3)

te donnera:

Hello

Cependant, c'est une mauvaise pratique. Vous devriez plutôt utiliser des dictionnaires ou des listes, comme le proposent d'autres. À moins bien sûr que vous vouliez vraiment savoir le faire, mais que vous ne vouliez pas l'utiliser.

51
Tadeck

Il est tout simplement inutile de créer des noms de variables. Pourquoi?

  • Ils sont inutiles: vous pouvez tout stocker dans des listes, des dictionnaires, etc.
  • Ils sont difficiles à créer: vous devez utiliser exec ou globals()
  • Vous ne pouvez pas les utiliser: comment écrivez-vous du code qui utilise ces variables? Vous devez utiliser à nouveau exec/globals()

Utiliser une liste est beaucoup plus facile:

# 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
11
Jochen Ritzel

Ne faites pas cela, utilisez un dictionnaire

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

ne fais pas ça utiliser un dict

globals () présente un risque car il vous indique ce que l'espace de noms pointe actuellement, mais cela peut changer et modifier le retour de globals () n'est pas une bonne idée.

9
Aaron Goldman

Une façon de faire est d'utiliser exec(). Par exemple:

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

Ici, je profite du formatage pratique de la chaîne f dans python 3.6+

9
Collin W.

Je voudrais utiliser une liste:

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

De cette façon, vous auriez 9 "Bonjour" et vous pourriez les obtenir individuellement comme ceci:

string[x]

x identifierait le "Bonjour" que vous voulez.

Ainsi, print(string[1]) afficherait Hello.

3
Lledargo

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

Cela devrait marcher.

2
Abhishek Rai

Je pense que le défi ici est de ne pas faire appel à global ()

Personnellement, je définirais une liste de vos variables (dynamiques), puis l’ajouterais dans une boucle for. Utilisez ensuite une boucle for distincte pour afficher chaque entrée ou même exécuter d'autres opérations.

Voici un exemple - J'ai plusieurs commutateurs de réseau (disons entre 2 et 8) dans différentes BRanches. Maintenant, je dois m'assurer que je dispose d'un moyen de déterminer le nombre de commutateurs disponibles (ou de tests actifs) dans une branche donnée, puis d'effectuer certaines opérations sur ceux-ci.

Voici mon code:

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 __== '__main__':
    main()

La sortie est:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

1
Cumar Chan