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"


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!


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.


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+


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

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


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

Isso deve funcionar.


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.


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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.