6.2.2 중첩 제어구조로 리스트 다루기
이번에는 조건문과 반복문을 함께 사용해 봅시다. 한 반에 25명의 학생이 있습니다. 모든 학생의 점수를 리스트에 저장하고, 70점 이상인 학생의 학생 번호와 점수를 출력합니다. 점수 25개를 직접 넣기에는 너무 많으니 random 라이브러리를 활용해 0부터 100 사이의 무작위 정수를 리스트에 추가하겠습니다. 학생 번호는 리스트에 저장된 순서대로 1번부터 25번이라고 가정합니다.
먼저 score라는 빈 리스트를 만듭니다. 그런 다음 score 리스트에 무작위 정수를 25개 넣습니다. 무작위 정수는 random.randint()로 만들 수 있습니다. 이를 score.append()에 넣어 무작위 정수를 score 리스트에 추가하는 코드를 작성합니다. 그리고 이 코드를 반복문으로 25번 반복하면 리스트에 점수 25개가 채워집니다. 반복하는 동안 변하는 score 리스트를 확인할 수 있게 print() 명령어도 반복문 내부에 넣어 봅시다.
import random
score = []
for i in range(25):
score.append(random.randint(0, 100))
print(score)
실행결과
[44]
[44, 33]
…
[44, 33, 27, 24, 4, 76, 45, 58, 84, 98, 60, 80, 19, 41, 94, 88, 83, 67, 44, 43, 70, 56, 69, 79, 14]
[44, 33, 27, 24, 4, 76, 45, 58, 84, 98, 60, 80, 19, 41, 94, 88, 83, 67, 44, 43, 70, 56, 69, 79, 14]
score 리스트가 변하는 과정이 보입니다(실행결과가 길어서 중간 결과는 생략했습니다). 무작위 정수를 넣으므로 이 책과 실행결과는 다를 수 있습니다.
score 리스트를 채웠으니 반에서 70점 이상인 학생의 번호와 점수를 출력해 봅시다. 먼저 리스트의 요소 값이 70 이상인 하나씩 확인해야 합니다. 리스트에 25개의 요소가 있으니 총 25번을 해야 합니다. 여기에서도 반복문을 사용합니다.
반복문으로 리스트의 요소에 접근하는 방법은 6.1 여러 데이터 한 번에 묶기에서 배웠듯이 두 가지입니다. 반복문 형식인 for i in data의 data 부분에 리스트를 그대로 넣어 요소에 직접 접근하는 방법과 range()를 사용해 인덱스로 접근하는 방법입니다. data에 어떤 것을 넣느냐에 따라 i 변수에 담기는 값이 달라집니다. 사실 반복문에서 다룬 부분이지만, 리스트를 배우기 전이었으므로 이번에 확실히 이해하고 넘어갑시다.
간단히 설명하기 위해 score에 저장된 값이 [25, 94, 63, 34, 86]이라고 가정합니다. 반복문에서 data 위치에 score 리스트를 넣으면 컴퓨터는 다음과 같이 해석합니다.
![](https://thebook.io/img/080251/248_1.jpg)
score라고 리스트명을 적었지만, score는 [25, 94, 63, 34, 86]을 담고 있으므로 컴퓨터는 코드를 오른쪽 그림처럼 인식하죠. 따라서 s 변수에(인덱스가 아니므로 변수를 i가 아닌 score의 s로 설정) 25, 94, 63, 34, 86이 차례대로 저장됩니다. 가장 먼저 s에 25가 저장되면 print(s)가 실행되어 25가 출력되고, 다음으로 s에 94가 저장되면 94가 출력됩니다. 이처럼 s에 리스트의 요소가 직접 저장됩니다.
이번에는 data 위치에 리스트가 아닌 인덱스를 넣어 리스트를 다뤄 봅시다. 0부터 4까지의 인덱스 범위를 나타낸다면 range(5)를 사용합니다.
![](https://thebook.io/img/080251/248_2.jpg)
range(5)는 [0, 1, 2, 3, 4]로 표현할 수 있습니다(실제로는 리스트 타입이 아니지만, 여기서는 설명하기 쉽게 데이터 묶음으로 표현했습니다). 따라서 i 변수에는 0부터 1씩 증가한 숫자가 차례대로 들어갑니다. 이때 i 변수는 score 리스트의 인덱스가 되어 score 리스트의 모든 요소를 출력할 수 있습니다.
그럼 두 방법 모두 코드로 작성해 보겠습니다. 이번에는 print()를 반복문 외부로 빼서 한 번만 실행하게 합니다.
import random
score = []
for i in range(25):
score.append(random.randint(0, 100))
print(score)
print('리스트를 사용해 70점 이상인 점수 출력하기')
for s in score:
if s >= 70:
print(score.index(s) + 1, '번', s)
print('인덱스를 사용해 70점 이상인 점수 출력하기')
for i in range(len(score)): # 또는 for i in range(25)
if score[i] >= 70:
print(i + 1, '번', score[i])
실행결과
[93, 37, 94, 38, 73, 75, 99, 40, 87, 93, 9, 76, 31, 40, 54, 31, 25, 77, 40, 46, 40, 39, 45, 9, 68]
리스트를 사용해 70점 이상인 점수 출력하기
1 번 93
3 번 94
…
인덱스를 사용해 70점 이상인 점수 출력하기
1 번 93
3 번 94
…
첫 번째 코드에서는 리스트를 그대로 반복문의 data 부분에 넣습니다. 점수가 s 변수에 담기고 s의 값이 70 이상일 때만 학생 번호와 점수를 출력합니다. 이때 학생 번호는 1부터 시작하므로 s 값의 인덱스인 score.index(s)에 1을 더해 출력하고, 점수는 s 변수의 값을 그대로 출력합니다.
두 번째 코드에서는 반복문의 data 부분에 연속된 숫자 범위를 나타내는 range()를 넣습니다. 또는 리스트 길이를 사용하면 range(len(score))가 됩니다. score에는 25개의 요소가 있으므로 range(25)로 작성해도 됩니다. 이때 i 변수는 리스트의 인덱스가 되어 score[i]가 70 이상일 때만 학생 번호와 점수를 출력하는 명령어가 실행됩니다. 여기서 학생 번호는 인덱스에 1을 더한 i + 1이 되고, 점수는 score[i]가 됩니다.
두 방법 모두 결과는 같습니다. 인덱스로 반복문을 작성하는 방법이 어렵다면 다음을 참고하세요.
![](https://thebook.io/img/080251/250.jpg)
이처럼 조건문과 반복문에서 리스트를 자주 사용하니 확실하게 이해하고 넘어가기 바랍니다.