루프에서 다른 변수 이름을 어떻게 생성합니까? [복제]


125

예를 들어 ...

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

그래서 나는 string1, string2, string3으로 끝납니다. 모두 "Hello"와 같습니다.


34
대답은 당신이 이것을하고 싶지 않다는 것입니다. 대신 목록을 사용하십시오.
Sven Marnach

2
당신이 그것을 사용하고자하는 곳이라면 당신은 할 수 x = ["Hello" * 9]그때까지 액세스 x[0], x[1] ...당신은 내가 당신이 우리에게 더 많은 코드 배경을 제공 할 것이다 생각하는 다른 방법을 사용합니다.
James Khoury

3
내가 언어에 대한 힘이 있다면 변수 이름에 숫자를 사용하면 SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
그리고 문자열을 잊지 마세요 0;)
wim

10
@James Khoury : 정답이 아닙니다. 그러면 x"HelloHelloHelloHelloHelloHelloHelloHelloHello"문자열 인 단일 요소를 포함하는 목록이됩니다. 당신이 의미하는 것 같아요 x = ["Hello"] * 9.

답변:


162

물론 넌 할 수있어; 사전 이라고합니다 .

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

나는이 다소 혀를 점검했지만 실제로 한 값을 다른 값과 연관시키는 가장 좋은 방법은 사전입니다. 그것이 바로 그것이 설계된 것입니다!


62

정말 나쁜 생각이지만 ...

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

그리고 예를 들면 :

print(string3)

당신에게 줄 것입니다 :

Hello

그러나 이것은 나쁜 습관입니다. 다른 사람들이 제안하는대로 사전이나 목록을 대신 사용해야합니다. 물론 방법을 알고 싶었지만 사용하고 싶지 않은 경우가 아니라면 말입니다.


2
이것이 왜 나쁜 생각인지 자세히 설명해 주시겠습니까?
ajdigregorio

6
@paintedcones : 첫째, 한 가지 방법이 있어야하며 간단한 사전을 사용하는 것이 더 자연 스럽습니다. 대신 전역 사전을 사용하는 것은 "암묵적으로"전역 변수를 생성하거나 수정하기 때문에 나쁜 생각입니다. 이 방법으로 변수를 설정하고 수정하려면 사전 표기법이 필요하므로 globals()간단한 .NET Framework 대신 사용할 이유가 없습니다 dict.
Tadeck 2014

x1, x2, x3 등의 변수를 만들어야하는 몇 가지 상황이 있습니다.하지만 대부분의 상황에서 사전을 사용하는 것이 가장 적절한 방법입니다.
DevilApple227

20

이를 수행 할 수있는 한 가지 방법은 exec(). 예를 들면 :

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

여기서 저는 Python 3.6+에서 편리한 f 문자열 형식을 활용하고 있습니다.


5
exec무언가, 흑 마법, 공격 취약성, 나쁜 것들을 기억 하지만 질문에 대답합니다.
psaxton

18

변수 변수 이름을 만드는 것은 의미가 없습니다. 왜?

  • 불필요합니다 : 모든 것을 목록, 사전 등에 저장할 수 있습니다.
  • 생성하기 어렵습니다. 사용 exec하거나globals()
  • 사용할 수 없습니다. 이러한 변수를 사용하는 코드를 어떻게 작성합니까? exec/globals()다시 사용해야 합니다

목록을 사용하는 것이 훨씬 쉽습니다.

# 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

감사합니다!! 사전 또는 데이터 프레임 목록 중에서 형식을 선택해야했습니다. 그리고 데이터 프레임의 특정 값을 기준으로 데이터 프레임을 재정렬해야했기 때문에 사전 형식을 사용할 수 없었습니다. 그래 니가 맞아! 어떤 경우에는 변수 이름을 만드는 것이 정말 무의미합니다!
두 현 신

9

사전을 사용하지 마십시오.

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

dict를 사용하지 마십시오

globals ()는 네임 스페이스가 현재 가리키는 것을 제공하므로 위험이 있지만 변경 될 수 있으므로 globals ()의 반환 값을 수정하는 것은 좋은 생각이 아닙니다.



3

목록을 사용합니다.

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

이렇게하면 9 개의 "Hello"가 있고 다음과 같이 개별적으로 가져올 수 있습니다.

string[x]

어디 x당신이 원하는에 "Hello"를 식별한다.

그래서 print(string[1])인쇄 Hello합니다.


1
일부 언어와 달리 아직 존재하지 않는 Python 목록의 요소에는 할당 할 수 없습니다 ( "목록 할당 색인이 범위를 벗어남"오류가 발생 함). string.append("Hello")대신 사용할 수 있습니다 .
Greg Hewgill

1
그걸 알았어 야 했어. 상기시켜 줘서 고마워. 고정되어 있습니다.
Lledargo

당신의 권리, 나는 배열에 추가하는 것이 아니라 문자열의 끝에 추가하려고 생각했습니다. 모두 사과드립니다.
Lledargo

간절히 '당신은 9 개의 "Hello"를 가질 것입니다.'는 "당신은 1 개의"Hello "를 9 번 가질 것입니다."이어야합니다. 9 개의 다른 문자열이 아니라 동일한 문자열이 반복됩니다.
Duncan

2

여기서 도전은 global ()을 호출하는 것이 아니라고 생각합니다.

개인적으로 보유 할 (동적) 변수 목록을 정의한 다음 for 루프 내에서 추가합니다. 그런 다음 별도의 for 루프를 사용하여 각 항목을 보거나 다른 작업을 실행할 수도 있습니다.

다음은 예입니다. 여러 BRanches에 여러 네트워크 스위치 (예 : 2 ~ 8 개)가 있습니다. 이제 특정 분기에서 사용할 수있는 스위치 수 (또는 활성-핑 테스트)를 확인한 다음 일부 작업을 수행 할 방법이 있는지 확인해야합니다.

내 코드는 다음과 같습니다.

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

출력은 다음과 같습니다.

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

사전을 사용하는 것은 변수 및 관련 값을 유지하는 올바른 방법이어야하며 다음을 사용할 수 있습니다.

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

그러나 변수를 지역 변수에 추가하려면 다음을 사용할 수 있습니다.

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

예를 들어 0에서 8까지의 값을 할당하려면 다음을 사용할 수 있습니다.

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

0

딕셔너리는 값을 포함 할 수 있으며 값은 update () 메서드를 사용하여 추가 할 수 있습니다. 시스템에서 변수를 생성하기를 원하므로 보관할 위치를 알아야합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.