Como você cria diferentes nomes de variáveis ​​em um loop? [duplicado]

125

Por exemplo, para fins ...

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

Então eu acabei com string1, string2, string3 ... todos iguais a "Hello"

Takkun
fonte
34
A resposta é que você não quer fazer isso. Use uma lista em seu lugar.
Sven Marnach
2
Se é aqui que você deseja usá-lo, você pode x = ["Hello" * 9]acessá-lo por x[0], x[1] ...Se você quiser usá-lo de uma maneira diferente, acho que você terá que nos fornecer um pouco mais de experiência com o código.
James Khoury
3
Se eu tiver poder sobre a linguagem, em seguida, usando números em nomes de variáveis dará SyntaxError: Use a data structure.;-)
Jochen Ritzel
1
e não esqueça sua string0;)
wim
10
@ James Khoury: Isso não está certo. Isso acabaria xsendo uma lista contendo um único elemento - a sequência "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello". Eu acho que você quis dizer x = ["Hello"] * 9.

Respostas:

162

Certamente você pode; é chamado de dicionário :

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'}

Eu disse isso de certa forma, mas a melhor maneira de associar um valor a outro é um dicionário. Foi para isso que foi projetado!

o lobo
fonte
62

É uma péssima ideia, mas ...

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

e depois por exemplo:

print(string3)

Darei à você:

Hello

No entanto, isso é uma prática ruim. Você deve usar dicionários ou listas, como outros propõem. A menos, é claro, que você realmente queira saber como fazê-lo, mas não queira usá-lo.

Tadeck
fonte
2
Você pode explicar por que essa é uma má ideia?
ajdigregorio 8/07/2014
6
@paintedcones: Primeiro, deve haver uma maneira de fazer isso , e usar dicionários simples é mais natural. Usar o dicionário global é uma má idéia, porque também "implicitamente" cria variáveis ​​globais ou as modifica. Como definir e modificar variáveis ​​dessa maneira requer notação no dicionário, não há razão para usar em globals()vez de algumas simples dict.
Tadeck
Existem algumas situações em que você precisa criar várias variáveis, x1, x2, x3, etc. Mas, na maioria das situações, o uso de um dicionário é realmente a coisa mais apropriada.
precisa saber é o seguinte
20

Uma maneira de fazer isso é com exec(). Por exemplo:

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

Aqui estou aproveitando a formatação prática da string f no Python 3.6+

Collin W.
fonte
5
Lembre-se de execalgo, magia negra, vulnerabilidades de ataque, coisas ruins, mas responde à pergunta conforme solicitado.
Psaxton #
18

É simplesmente inútil criar nomes de variáveis ​​variáveis. Por quê?

  • Eles são desnecessários: você pode armazenar tudo em listas, dicionários e assim por diante
  • Eles são difíceis de criar: você precisa usar execouglobals()
  • Você não pode usá-los: Como você escreve código que usa essas variáveis? Você tem que usar exec/globals()novamente

Usar uma lista é muito mais 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
fonte
Obrigado!! Eu precisava escolher o formulário entre o dicionário ou a lista de dataframe. E como eu precisava reordenar o quadro de dados com base em um determinado valor no quadro de dados, não poderia ter usado o formulário de dicionário. Sim você está certo! Em alguns casos, é realmente inútil criar nomes de variáveis!
Doo Hyun Shin
9

Não faça isso, use um dicionário

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

não faça isso, use um ditado

globals () tem risco, pois fornece a você o que o espaço para nome está apontando, mas isso pode mudar e, portanto, modificar o retorno de globals () não é uma boa ideia

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

Isso deve funcionar.

Abhishek Rai
fonte
3

Eu usaria uma lista:

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

Dessa forma, você teria 9 "Olá" e poderia obtê-los individualmente assim:

string[x]

Onde xidentificaria qual "Olá" você deseja.

Então, print(string[1])iria imprimir Hello.

Lledargo
fonte
1
Diferentemente de alguns idiomas, você não pode atribuir a elementos em uma lista Python que ainda não existem (você receberá um erro "índice de atribuição de lista fora do intervalo"). Você pode usar em seu string.append("Hello")lugar.
Greg Hewgill
1
Eu deveria saber disso, obrigado por me lembrar. Está corrigido.
Lledargo
Você está certo, eu estava pensando em adicionar no final de uma string, não em uma matriz. Peço desculpas a todos.
Lledargo
Pedanticamente 'você teria 9 "Olá"' deveria ser 'você teria 1 "Olá" 9 vezes'. É a mesma sequência repetida, não nove seqüências de diferença.
Duncan
2

Eu acho que o desafio aqui não é invocar global ()

Eu pessoalmente definiria uma lista para suas variáveis ​​(dinâmicas) a serem mantidas e, em seguida, acrescentaria a ela dentro de um loop for. Em seguida, use um loop for separado para visualizar cada entrada ou até executar outras operações.

Aqui está um exemplo - eu tenho vários comutadores de rede (digamos entre 2 e 8) em várias filiais. Agora, preciso garantir que tenho uma maneira de determinar quantos comutadores estão disponíveis (ou teste de ping ativo) em qualquer ramificação e executar algumas operações neles.

Aqui está o meu 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()

A saída é:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

Cumar Chan
fonte
2

O uso de dicionários deve ser o caminho certo para manter as variáveis ​​e os valores associados, e você pode usar isso:

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

Mas se você deseja adicionar as variáveis ​​às variáveis ​​locais, pode usar:

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

E, por exemplo, se você desejar atribuir os valores de 0 a 8, poderá usar:

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

O dicionário pode conter valores e os valores podem ser adicionados usando o método update (). Você deseja que seu sistema crie variáveis, portanto, você deve saber onde manter.

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
fonte