
12. 리스트 - 데이터를 줄 세우기
학생 30명의 점수를 저장하려면 변수 30개가 필요할까? 아니다. 리스트 하나면 된다. 파이썬에서 가장 많이 쓰이는 자료구조인 리스트를 철저하게 파헤쳐보자.
리스트란?
여러 값을 하나의 변수에 순서대로 저장하는 자료구조다.
# 변수를 여러 개 만드는 대신...
score1 = 85
score2 = 92
score3 = 78
# 리스트 하나로!
scores = [85, 92, 78]

리스트 만들기
# 숫자 리스트
numbers = [1, 2, 3, 4, 5]
# 문자열 리스트
fruits = ["사과", "바나나", "포도"]
# 섞어서 담기 (가능하지만 보통은 같은 타입끼리)
mixed = [1, "hello", True, 3.14]
# 빈 리스트
empty = []
인덱싱과 슬라이싱
4편(문자열)에서 배운 인덱싱과 슬라이싱이 리스트에도 똑같이 적용된다.
인덱싱
fruits = ["사과", "바나나", "포도", "딸기", "수박"]
print(fruits[0]) # 사과 (첫 번째)
print(fruits[2]) # 포도 (세 번째)
print(fruits[-1]) # 수박 (마지막)
print(fruits[-2]) # 딸기 (뒤에서 두 번째)
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 값 | 사과 | 바나나 | 포도 | 딸기 | 수박 |
| 역방향 | -5 | -4 | -3 | -2 | -1 |
슬라이싱
numbers = [10, 20, 30, 40, 50, 60, 70]
print(numbers[1:4]) # [20, 30, 40]
print(numbers[:3]) # [10, 20, 30]
print(numbers[4:]) # [50, 60, 70]
print(numbers[::2]) # [10, 30, 50, 70] (2칸 간격)
print(numbers[::-1]) # [70, 60, 50, 40, 30, 20, 10] (역순)
리스트 값 수정
문자열과 달리 리스트는 수정 가능(mutable)하다!
fruits = ["사과", "바나나", "포도"]
fruits[1] = "망고" # 바나나 → 망고로 변경
print(fruits) # ['사과', '망고', '포도']
리스트 주요 메서드

추가 메서드
fruits = ["사과", "바나나"]
# append: 맨 끝에 추가
fruits.append("포도")
print(fruits) # ['사과', '바나나', '포도']
# insert: 원하는 위치에 삽입
fruits.insert(1, "딸기")
print(fruits) # ['사과', '딸기', '바나나', '포도']
# extend: 리스트를 합치기
fruits.extend(["수박", "키위"])
print(fruits) # ['사과', '딸기', '바나나', '포도', '수박', '키위']
삭제 메서드
fruits = ["사과", "바나나", "포도", "딸기", "수박"]
# remove: 값으로 삭제 (첫 번째 일치)
fruits.remove("포도")
print(fruits) # ['사과', '바나나', '딸기', '수박']
# pop: 인덱스로 삭제 (삭제한 값 반환)
removed = fruits.pop(1)
print(removed) # 바나나
print(fruits) # ['사과', '딸기', '수박']
# pop(): 마지막 요소 삭제
last = fruits.pop()
print(last) # 수박
# clear: 전부 삭제
fruits.clear()
print(fruits) # []
탐색 메서드
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# index: 값의 위치 찾기
print(numbers.index(5)) # 4
# count: 값의 개수 세기
print(numbers.count(1)) # 2
# in: 포함 여부
print(5 in numbers) # True
print(10 in numbers) # False
정렬 메서드
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# sort: 원본을 정렬 (오름차순)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# sort(reverse=True): 내림차순
numbers.sort(reverse=True)
print(numbers) # [9, 6, 5, 4, 3, 2, 1, 1]
# reverse: 순서 뒤집기
numbers.reverse()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
⚠️ sort() vs sorted():
sort()는 원본 리스트를 변경하고,sorted()는 원본은 그대로 두고 새 리스트를 반환한다.
original = [3, 1, 4, 1, 5]
new_list = sorted(original)
print(original) # [3, 1, 4, 1, 5] (그대로!)
print(new_list) # [1, 1, 3, 4, 5] (새 리스트)
| 메서드 | 기능 | 예시 |
|---|---|---|
| append(x) | 맨 끝에 추가 | lst.append(10) |
| insert(i, x) | i번 위치에 삽입 | lst.insert(0, 99) |
| extend(lst2) | 리스트 합치기 | lst.extend([1,2]) |
| remove(x) | 값 x 삭제 (첫 번째) | lst.remove("a") |
| pop(i) | i번째 삭제 + 반환 | lst.pop(0) |
| sort() | 오름차순 정렬 (원본 변경) | lst.sort() |
| reverse() | 순서 뒤집기 | lst.reverse() |
리스트 연산
# + : 리스트 합치기
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b) # [1, 2, 3, 4, 5, 6]
# * : 반복
print([0] * 5) # [0, 0, 0, 0, 0]
# len() : 길이
print(len(a)) # 3
# sum(), min(), max()
numbers = [10, 20, 30, 40, 50]
print(sum(numbers)) # 150
print(min(numbers)) # 10
print(max(numbers)) # 50
리스트와 반복문
리스트는 for문과 함께 쓸 때 진가를 발휘한다.
fruits = ["사과", "바나나", "포도", "딸기"]
# 기본 순회
for fruit in fruits:
print(fruit)
# enumerate: 인덱스와 함께
for i, fruit in enumerate(fruits):
print(f"{i+1}. {fruit}")
# 조건 필터링
scores = [85, 42, 90, 67, 55, 93, 78]
passed = []
for score in scores:
if score >= 60:
passed.append(score)
print(f"합격: {passed}") # [85, 90, 67, 93, 78]
2차원 리스트
리스트 안에 리스트를 넣으면 표(테이블)처럼 데이터를 관리할 수 있다.
# 3x3 행렬
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 접근: matrix[행][열]
print(matrix[0][0]) # 1 (1행 1열)
print(matrix[1][2]) # 6 (2행 3열)
print(matrix[2][1]) # 8 (3행 2열)
# 전체 출력
for row in matrix:
for num in row:
print(f"{num:3d}", end="")
print()
# 학생 성적 관리
students = [
["김철수", 85, 90, 78],
["이영희", 92, 88, 95],
["박민수", 78, 82, 80]
]
for name, kor, eng, math in students:
avg = (kor + eng + math) / 3
print(f"{name}: 평균 {avg:.1f}점")
김철수: 평균 84.3점
이영희: 평균 91.7점
박민수: 평균 80.0점
리스트 복사 주의사항
# 이렇게 하면 복사가 아니라 '같은 리스트'를 가리킨다!
a = [1, 2, 3]
b = a # 같은 객체를 참조
b[0] = 999
print(a) # [999, 2, 3] ← a도 바뀜!
# 진짜 복사 방법
a = [1, 2, 3]
b = a[:] # 슬라이싱으로 복사
c = a.copy() # copy() 메서드
d = list(a) # list() 함수
b[0] = 999
print(a) # [1, 2, 3] ← a는 그대로!
⚠️ 핵심:
b = a는 복사가 아니라 같은 리스트를 함께 가리키는 것이다. 독립적인 복사본이 필요하면a[:],a.copy(),list(a)중 하나를 사용하자.
실전 예시: 성적 관리 프로그램
scores = []
print("=" * 30)
print(" 성적 입력 프로그램")
print("=" * 30)
while True:
score = input("점수 입력 (q: 종료): ")
if score == "q":
break
scores.append(int(score))
if scores:
print(f"\n입력한 점수: {scores}")
print(f"총 {len(scores)}명")
print(f"합계: {sum(scores)}점")
print(f"평균: {sum(scores)/len(scores):.1f}점")
print(f"최고: {max(scores)}점")
print(f"최저: {min(scores)}점")
# 정렬해서 보여주기
sorted_scores = sorted(scores, reverse=True)
print(f"순위: {sorted_scores}")
else:
print("입력한 점수가 없습니다.")
직접 해보기
문제 1. 숫자 리스트에서 짝수만 골라 새 리스트를 만들어보자.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 결과: [2, 4, 6, 8, 10]
문제 2. 두 리스트의 공통 요소를 찾아보자.
a = [1, 3, 5, 7, 9]
b = [2, 3, 5, 8, 9]
# 결과: [3, 5, 9]
문제 3. 리스트에서 중복을 제거해보자 (순서 유지).
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# 결과: [3, 1, 4, 5, 9, 2, 6]
문제 4. 학생 점수 리스트에서 상위 3명의 점수를 출력해보자.
scores = [67, 93, 85, 42, 78, 95, 88, 71]
# 결과: 1등: 95점, 2등: 93점, 3등: 88점
정답 보기
# 문제 1
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = []
for n in numbers:
if n % 2 == 0:
evens.append(n)
print(evens) # [2, 4, 6, 8, 10]
# 문제 2
a = [1, 3, 5, 7, 9]
b = [2, 3, 5, 8, 9]
common = []
for x in a:
if x in b:
common.append(x)
print(common) # [3, 5, 9]
# 문제 3
data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
unique = []
for x in data:
if x not in unique:
unique.append(x)
print(unique) # [3, 1, 4, 5, 9, 2, 6]
# 문제 4
scores = [67, 93, 85, 42, 78, 95, 88, 71]
top3 = sorted(scores, reverse=True)[:3]
for i, score in enumerate(top3, start=1):
print(f"{i}등: {score}점")
오늘의 정리
| 항목 | 내용 |
|---|---|
| 리스트 생성 | [값1, 값2, ...] — 순서가 있고, 수정 가능 |
| 인덱싱/슬라이싱 | 문자열과 동일. lst[0], lst[1:3], lst[::-1] |
| 주요 메서드 | append, insert, remove, pop, sort, reverse, index, count |
| 내장 함수 | len(), sum(), min(), max(), sorted() |
| 복사 주의 | b = a는 참조 복사! 진짜 복사는 a[:] 또는 a.copy() |
다음 편 예고: 딕셔너리 - 이름표를 붙인 데이터
리스트는 인덱스(번호)로 접근했다면, 딕셔너리는 이름(키)으로 접근한다. "학생 이름으로 점수 찾기" 같은 작업이 훨씬 직관적으로 가능해진다.
태그: 파이썬 Python 파이썬독학 리스트 list 인덱싱 슬라이싱 append 자료구조 파이썬기초 IT교육
'Python' 카테고리의 다른 글
| 14. 튜플과 세트 - 용도에 맞는 그릇 선택 (0) | 2026.02.22 |
|---|---|
| 13. 딕셔너리 - 이름표를 붙인 데이터 (0) | 2026.02.22 |
| 11. 실습: 숫자 맞추기 게임 만들기 (0) | 2026.02.21 |
| 10. 중첩 반복문 - 별 찍기로 연습하기 (0) | 2026.02.21 |
| 09. 반복문 (2) - while문과 반복 제어 (0) | 2026.02.21 |
댓글