리스트(List) — 여러 값을 하나로 묶어서 관리하기
지금까지는 변수 하나에 값을 하나씩만 담았습니다.
이 글에서는 여러 값을 순서대로 하나의 변수에 묶어서 담는 리스트를 배우고,
지난 화에서 배운 for 반복문으로 리스트의 값을 하나씩 꺼내 쓰는 법까지 정리해요.
요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠.
개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.
이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.
고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.
중간중간 빈칸 채우기랑 학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

1화에서 변수는 데이터를 담아두는 바구니와 같다고 했었죠.
name = "홍길동"처럼, 바구니 하나에는 값을 하나만 담을 수 있었습니다.
그런데 프로그램을 만들다 보면 값 하나가 아니라 여러 개의 값을 한꺼번에 다뤄야 하는 경우가 훨씬 많습니다.
이렇게 여러 값을 묶어서 저장하고 다루는 방법을 자료구조(Data Structure)라고 불러요.
오늘 배울 리스트가 바로 그 첫 번째 자료구조입니다.
지금까지는 학생 한 명의 점수를 저장하려면 score = 90처럼 변수 하나에 값 하나만 담았습니다.
그런데 학생 5명의 점수를 모두 저장하려면 어떻게 해야 할까요? score1, score2, score3...처럼 변수를 계속 늘리는 건 너무 불편합니다.
이럴 때 사용하는 것이 리스트(List)입니다.
바구니 하나에는 값을 하나만 담을 수 있었는데, 리스트는 그런 바구니 여러 개를 기차처럼 한 줄로 쭉 연결해서, 전체를 하나의 이름으로 다루는 것이라고 생각하면 됩니다. 기차의 각 칸(바구니)에는 순서대로 번호가 매겨져 있어서, 몇 번째 칸인지만 알면 그 칸에 담긴 물건을 바로 꺼낼 수 있어요. 연결된 바구니 전체는 하나의 이름표를 붙이고, 그 안의 각 칸은 번호(인덱스)로 구분하는 거죠.
앞으로 배울 딕셔너리, 튜플, 집합도 모두 자료구조의 한 종류이고, 리스트는 그중 가장 기본이 되는 형태예요.
대괄호 [ ] 안에 값을 쉼표로 구분해서 나열하면 리스트가 만들어집니다.
print(fruits)
리스트의 각 칸에는 번호(인덱스)가 붙어 있는데, 0번부터 시작합니다. fruits[0]은 첫 번째 값, fruits[1]은 두 번째 값이에요. range()가 0부터 시작했던 것과 같은 이유입니다.
print(fruits[0])
print(fruits[1])
print(fruits[-1])
print(len(fruits))
바나나
딸기
3
fruits[-1]은 맨 마지막 값을 가리킵니다. 뒤에서부터 세는 것이라 -1이 마지막, -2가 뒤에서 두 번째예요.
len(fruits)는 리스트에 값이 몇 개 들어있는지 알려줍니다. 이 리스트는 3개니까 사용 가능한 인덱스는 0, 1, 2까지입니다 — fruits[3]을 쓰면 오류가 나요.
- fruits 리스트의 마지막 값("딸기")을 출력하도록 빈칸을 채우시오.
fruits = ["사과", "바나나", "딸기"]
print(fruits[])
정답
- 다음 코드의 실행 결과를 작성하시오.
numbers = [10, 20, 30, 40]
print(numbers[1])
print(len(numbers)) - 리스트의 인덱스가 몇 번부터 시작하는지 쓰시오.
정답
4
2. 0번부터 시작합니다.
리스트는 한 번 만들고 끝이 아니라, 나중에 값을 추가하거나 지우거나 바꿀 수 있습니다. 자주 쓰는 기능들을 정리해볼게요.
| 기능 | 사용법 | 동작 |
|---|---|---|
| 맨 뒤에 추가 | fruits.append(값) |
리스트 맨 끝에 새로운 값을 하나 추가 |
| 중간에 추가 | fruits.insert(위치, 값) |
지정한 인덱스에 새 값을 끼워 넣음 |
| 값으로 삭제 | fruits.remove(값) |
리스트에서 그 값을 찾아서 삭제 |
| 꺼내며 삭제 | fruits.pop() |
맨 마지막 인덱스의 값을 꺼내면서 삭제 |
| 값 변경 | fruits[인덱스] = 새값 |
해당 인덱스의 값을 새 값으로 교체 |
fruits.append("포도")
print(fruits)
fruits.insert(1, "수박")
print(fruits)
fruits.remove("바나나")
print(fruits)
popped = fruits.pop()
print(popped)
print(fruits)
fruits[0] = "귤"
print(fruits)
① append로 "포도"를 맨 뒤에 추가 → ② insert로 인덱스 1 자리에 "수박"을 끼워 넣음 → ③ remove로 "바나나"를 찾아서 삭제 → ④ pop으로 맨 마지막 값("포도")을 꺼내면서 삭제 → ⑤ 인덱스 0번 값을 "귤"로 교체. 한 줄씩 print로 확인하면서 리스트가 어떻게 바뀌는지 눈으로 따라가 보세요.
remove(값)는 값을 기준으로 삭제하고, pop()은 위치(인덱스)를 기준으로 삭제합니다.
pop()은 괄호를 비워두면 맨 마지막 값을 꺼내지만, pop(0)처럼 인덱스를 넣으면 그 위치의 값을 꺼낼 수도 있어요.
- numbers 리스트 맨 뒤에 50을 추가하도록 빈칸을 채우시오.
numbers = [10, 20, 30]
numbers.(50)
print(numbers)
정답
- 다음 코드의 실행 결과를 작성하시오.
colors = ["빨강", "파랑", "초록"]
colors.remove("파랑")
colors.append("노랑")
print(colors) - remove()와 pop()의 차이를 서술하시오.
정답
2. remove()는 삭제할 값을 직접 지정해서 그 값을 찾아 삭제하고, pop()은 인덱스(위치)를 기준으로 값을 꺼내면서 삭제합니다.
리스트에 값이 100개 있다면, fruits[0]부터 fruits[99]까지 하나하나 꺼내는 건 너무 번거롭습니다. 지난 화에서 배운 for 반복문이 바로 이럴 때 쓰입니다.
for fruit in fruits:
print(fruit)
바나나
딸기
for i in range(5):에서 i에는 숫자가 들어왔습니다. for fruit in fruits:에서는 fruit에 리스트 안의 값이 하나씩 그대로 들어옵니다.
변수 이름은 자유롭게 정할 수 있지만, 관례적으로 리스트 이름의 단수형(fruits → fruit)을 씁니다.
for i in range(len(fruits)):
print(i, fruits[i])
1 바나나
2 딸기
값만 필요하면 방법 1이 더 간단합니다. 하지만 "몇 번째 값인지"도 함께 필요하거나, 리스트의 값을 직접 수정해야 한다면 인덱스가 필요한 방법 2를 씁니다. range(len(fruits))는 "리스트 길이만큼의 숫자"를 만들어서, 그 숫자를 인덱스로 사용하는 조합이에요.
total = 0
for score in scores:
total = total + score
print(total)
print(total / len(scores))
80.0
8화에서 배운 "반복문 전에 total = 0으로 초기화하고, 반복하면서 더한다"는 패턴이 리스트에도 똑같이 적용됩니다. 다만 이번엔 range(1, 11) 대신 scores 리스트 자체를 순회할 뿐이에요.
biggest = scores[0]
for score in scores:
if score > biggest:
biggest = score
print(biggest)
일단 첫 번째 값을 "지금까지 가장 큰 값"이라고 임시로 정해둡니다(biggest = scores[0]).
그 다음 나머지 값들을 하나씩 비교하면서, 더 큰 값을 만나면 biggest를 갱신합니다. 반 학생들 중 키가 가장 큰 사람을 찾을 때, 한 명씩 비교해나가는 것과 같은 방식이에요.
참고로 파이썬에는 이미 max(scores), sum(scores)라는 내장 함수가 있어서 실전에서는 이렇게 직접 구현할 필요가 없습니다. 하지만 반복문과 조건문을 조합하는 연습으로는 최댓값 찾기가 아주 좋은 훈련이에요.
- 다음 코드의 실행 결과를 작성하시오.
numbers = [3, 7, 2]
total = 0
for n in numbers:
total = total + n
print(total)
정답
- 다음 코드의 실행 결과를 작성하시오.
names = ["민수", "지연", "하늘"]
for i in range(len(names)):
print(i + 1, names[i]) for fruit in fruits:와for i in range(len(fruits)):의 차이를 서술하시오.
정답
2 지연
3 하늘
2. 앞의 방식은 리스트의 값을 직접 하나씩 꺼내오고, 뒤의 방식은 인덱스(숫자)를 하나씩 꺼내와서 그 인덱스로 값에 접근합니다. 값만 필요하면 앞의 방식이 간단하고, 인덱스 번호도 함께 필요하면 뒤의 방식을 씁니다.
'Language > Python' 카테고리의 다른 글
| [고등학생부터, 파이썬] 12. 딕셔너리(Dictionary) (0) | 2026.08.20 |
|---|---|
| [고등학생부터, 파이썬] 11. 튜플(Tuple)과 세트(Set) (0) | 2026.08.20 |
| [고등학생부터, 파이썬] 09. 중첩 반복문 (feat. 별찍기 예제) (0) | 2026.08.19 |
| [고등학생부터, 파이썬] 08. 반복문 for (0) | 2026.08.19 |
| [고등학생부터, 파이썬] 07. 반복문 while (0) | 2026.08.10 |
댓글