2017-11-30 23 views
0

프로그래밍에 대한 저의 첫 경험 인 파이썬을 배우는 중입니다. 나는 일련의 수업을 통해 일하고있다 here.파이썬에서리스트 인덱스 이름 바꾸기 - 코드 설명 찾기

내가 중점을 두는 교훈은 중첩 루프와 관련이 있습니다. 그러나 한 가지 연습에서는 목록 항목의 인덱스 이름을 본질적으로 바꾸어 문제에 대한 해결책을 제시합니다. 명심하십시오, 이것은 사전이 사용되지 않습니다. 이러한 교훈이 훌륭하게 진행되는 동안, 문제에 대한이 한 가지 대답은 무슨 일이 일어나고 있는지에 대한 설명이 없으므로 당황 스럽습니다. 게다가, 나는 레슨 시리즈 나 다른 곳에서는이 기술에 대한 참조를 찾을 수 없다.

여기 연습 문제가 저에게 요구하는 사항입니다. 1 중첩 된 for 루프를 사용하여 달력을 나타내는 3 차원 목록을 채우는 프로그램 작성 : 최상위 목록에는 각 달의 하위 목록이 있어야하며 각 달에는 4 주가 있어야합니다. 빈 목록 2 사람이 읽을 수있는 월 이름으로 캘린더의 한 달에 쉽게 액세스 할 수 있도록 코드를 수정하고 매주 1부터 번호가 매겨진 이름으로 매주 액세스하도록 코드를 수정하십시오. 7 월 둘째 주에 문자열 설명).

첫 번째 부분은 아무 문제가 없었다. 두 번째 부분은 비트가 매개 변수를 제공하지만, 주어진 대답은 내가 기대했던 아니었다 도전이었다.

내가 본 사전을 사용하여 스택 오버플로에 대한 설명 Python: can I have a list with named indices?

그러나, 여기에 솔루션을 제안했다 :이 정확히 어떻게 작동하는지

(JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER) = range(12) 

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4) 

calendar = [] 
for m in range(12): 
    month = [] 

    for w in range(4): 
     month.append([]) 

    calendar.append(month) 
calendar[JULY][WEEK_2].append("Go on holiday!") 
print(calendar) 

누군가가 설명 할 수 명명 인덱스 목표의이 종류를 달성? 나는 달과 주 이름이 문자열 일 필요는 없지만 오히려 변수 이름이라는 것이 이상하다는 것을 알았다. 각 변수 이름은 정의 된 특정 범위의 각 항목에 할당되어 있다고 생각합니다. 그러나 변수 이름을 목록 색인으로 사용할 수 있다는 사실에 놀랐습니다. 이 작업이 끝나면 더 이상 인덱스로 인덱스를 참조 할 수 없습니다. 예를 들어, 내가 사용할 수 없습니다

calendar[1][1].append("This is the first week of January.") 

내가 마지막 줄 후 간단한 루프를 쓸 때 나는 더이 때문에 혼란스러워하고 있습니다 :

for i in range(12): 
    print(i) 

을 내가로 (11)를 통해 숫자 0에서 인쇄를 얻을 수를 평범하지만이 변수 이름은 아닙니다.

정확히 무슨 일이 벌어지고 있으며 어떻게 작동합니까?

답변

0

이런 변수리스트 선언 :

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

여러 변수에 여러 값을 저장하는 방법이다. 그것은 이렇게 동일하다 :

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = (0,1,2,3) 

하거나 :

WEEK_1 = 0 
WEEK_2 = 1 
WEEK_3 = 2 
WEEK_4 = 3 

범위 (4) 0 내지 3의 정수의리스트를 반환한다.파이썬

range(4) == (0,1,2,3) 

, 좌측 피연산자로서 변수의리스트를 작성하고 오른쪽 피연산자 데이터의리스트를 작성하여 그 값을 할당 할 수있다. 이 경우 왼쪽에있는 목록의 첫 번째 변수는 오른쪽에 첫 번째 데이터 조각의 값을 저장하고 두 번째 변수는 오른쪽에 두 번째 데이터 조각의 값을 저장합니다.

운동 할 때, 달과 주는 정수로만 메모리에 저장됩니다. 이 정수는 모두 각 값이 나타내는 값을 나타내는 변수에 저장되어 있습니다.

당신이 말한 것과는 반대로 calendar[1][1].append("First week of January")가 작동합니다. 기술적으로, 목록의 색인이 0부터 시작하기 때문에 1 월 첫째주는 calendar[0][0]입니다. 앞서 언급했듯이 WEEK_1, WEEK_2 등은 정수가 저장되는 변수 이름이기 때문입니다. 따라서 정확히 똑같은 일이 몇 달간 계속됩니다. calendar[JULY][WEEK_2]이라고 말하면 calendar[7][1]을 말하는 것과 정확히 똑같습니다. 이제는 더 쉽게 읽을 수있는 변수에이 숫자를 저장 했으므로 코드가 읽고 이해하기 쉬운 코드를 더 잘 나타냅니다.

+0

1 월 첫 번째 주에 대한 예제에서이 색인이 1 씩 나간 것으로 나타났습니다. 나는 돌아가서'calendar [0] [0] .append ("1 월 첫째 주")'를 다시 시도했다. 전에 '인덱스가 범위를 벗어났습니다'라는 IndexError를 받았습니다. 그러나 이번에는 제가하지 않았습니다. 그래서 제가 원래의 시도에서 또 다른 오류가 있다고 믿게됩니다. 귀하의 설명이 나에게 도움이됩니다. 이제 색인에 사용되는 변수 목록을 인쇄하는 방법이 있습니까? 나는 다른 곳의 지표에 사용 된 변수를 보지 못했기 때문에 전체적인 생각을 좀 더 완전히 감싸려고 노력하고 있습니다. 감사! –

+0

나는 JANUARY = 0, FEBRUARY = 1' 등의 할당을 이해하는 동안 혼란이 어디에 남아 있는지 추측한다. 왜 나중에 '범위 내에서 (12)'라고 말하는 지 이해할 수 없다 : 나는 그들을 참조하고있다. 변수 및 정수가 아니라 정상적으로. 나는 왜 JANUARY = 0을 얻었지만, 0 = JANUARY라면, 왜 우리는 'w in range (4)'라고 말할 때이 갈등을하지 않습니까? 이 정보가 저장되는 위치를 파악하는 데 어려움을 겪고 있습니다. 이 코드의 끝 부분에'print (list (range (12)))'를 추가하면, 여전히 정수를 얻습니다. 왜 이것이 한 인스턴스에서 변수 집합을 참조하지만 다른 인스턴스는 참조하지 않습니까? –

1

좋아요, 이제는 더 잘 이해합니다. 내 혼란은 그것이 나에게 나타났다는 것, 나는 변수라는 이름의 색인을 할당했다. 나는 이제 숫자에 이름을 붙이고 있고 이 아니라 인덱스가임을 이해합니다. indecis는 항상 정수입니다.

은 내가 다음 중 하나를 사용하여 위의 코드의 월 둘째 주를 참조 할 수 있기 때문에 지금이 참조 :

calendar[0][1].append("Week 2 of January") 
calendar[JANUARY][WEEK_2].append("Week 2 of January") 
calendar[JANUARY][FEBRUARY].append("Week 2 of January") 
calendar[WEEK_1][WEEK_2].append("Week 2 of January") 

이 모든 인덱스를 가리키는 [1] [0]. 어떻게 든 마술처럼 범위 (12) 기능에 영향을 미치지 않았습니다.