Part 1: 수학 공부를 위한 파이썬 첫걸음
Chapter 5: 데이터를 모아 관리하기 (Managing Collections of Data - Lists)
학습 목표
- 여러 개의 데이터를 순서대로 저장하는 리스트(List)를 만들고 사용할 수 있다.
- 인덱싱(Indexing)을 사용하여 리스트의 특정 위치에 있는 요소에 접근할 수 있다.
- 슬라이싱(Slicing)을 사용하여 리스트의 일부분(부분 리스트)을 추출할 수 있다.
- 리스트의 길이를 구하는
len()
함수와 리스트에 요소를 추가하는append()
메소드를 사용할 수 있다. - 숫자로 이루어진 리스트에 대해
sum()
,min()
,max()
함수를 사용하여 합계, 최솟값, 최댓값을 계산할 수 있다.
1. 데이터 묶음의 필요성: 리스트의 등장
지금까지 우리는 변수 하나에 값 하나를 저장했습니다 (radius = 5
, name = "Alice"
). 하지만 만약 우리 반 학생 30명의 수학 점수를 모두 저장하고 싶다면, score1
, score2
, ..., score30
처럼 30개의 변수를 만드는 것은 매우 비효율적입니다.
이럴 때 필요한 것이 여러 개의 데이터를 하나의 묶음으로 관리할 수 있는 자료구조입니다. 파이썬에서 가장 기본적이고 널리 사용되는 데이터 묶음이 바로 리스트(List)입니다. 리스트를 사용하면 여러 개의 값들을 순서대로 저장하고, 각 값에 쉽게 접근하거나 수정할 수 있습니다. 마치 쇼핑 목록이나 학생 명단처럼 생각할 수 있습니다.
2. 리스트 만들기 와 기본 구조
리스트는 대괄호 []
안에 여러 개의 값(요소, element)들을 콤마(,
)로 구분하여 넣어 만듭니다. 리스트 안에는 숫자, 문자열, 심지어 다른 리스트 등 다양한 타입의 데이터를 섞어서 넣을 수도 있습니다.
# 빈 리스트 생성
empty_list = []
print(empty_list)
# 숫자로 이루어진 리스트
scores = [85, 92, 78, 100, 95]
print(scores)
# 문자열로 이루어진 리스트
fruits = ["apple", "banana", "cherry"]
print(fruits)
# 다양한 타입을 섞은 리스트
mixed_list = [1, "Python", 3.14, True, [10, 20]] # 리스트 안에 리스트도 가능!
print(mixed_list)
실행 결과:
[]
[85, 92, 78, 100, 95]
['apple', 'banana', 'cherry']
[1, 'Python', 3.14, True, [10, 20]]
3. 리스트 요소에 접근하기: 인덱싱 (Indexing)
리스트에 저장된 각 요소는 고유한 위치 번호(인덱스, index)를 가집니다. 이 인덱스를 사용하여 특정 위치의 요소에 접근할 수 있습니다. 주의할 점은 파이썬의 인덱스는 0부터 시작한다는 것입니다!
리스트이름[인덱스번호]
scores = [85, 92, 78, 100, 95]
# 인덱스: 0 1 2 3 4
# 첫 번째 요소 접근 (인덱스 0)
first_score = scores[0]
print(f"첫 번째 점수: {first_score}") # 출력: 85
# 세 번째 요소 접근 (인덱스 2)
third_score = scores[2]
print(f"세 번째 점수: {third_score}") # 출력: 78
# 마지막 요소 접근 (인덱스 4 또는 음수 인덱스 -1)
last_score = scores[4]
print(f"마지막 점수 (인덱스 4): {last_score}") # 출력: 95
last_score_neg = scores[-1] # 음수 인덱스: -1은 마지막, -2는 마지막에서 두 번째...
print(f"마지막 점수 (인덱스 -1): {last_score_neg}") # 출력: 95
# 리스트 요소 값 변경하기
print(f"변경 전 scores[1]: {scores[1]}") # 92
scores[1] = 90 # 인덱스 1의 값을 90으로 변경
print(f"변경 후 scores[1]: {scores[1]}") # 90
print(f"변경된 리스트: {scores}")
만약 존재하지 않는 인덱스(예: scores[5]
)에 접근하려고 하면 IndexError
가 발생합니다.
4. 리스트 잘라내기: 슬라이싱 (Slicing)
리스트의 특정 부분, 즉 부분 리스트(sub-list)를 추출하고 싶을 때 슬라이싱(Slicing)을 사용합니다. 콜론(:
)을 이용하여 시작 인덱스와 끝 인덱스를 지정합니다.
리스트이름[시작인덱스 : 끝인덱스]
시작인덱스
의 요소부터끝인덱스
의 바로 앞 요소까지 포함합니다 (끝인덱스
는 포함되지 않음!).시작인덱스
를 생략하면 처음부터 (인덱스 0부터) 시작합니다.끝인덱스
를 생략하면 마지막 요소까지 포함합니다.
리스트이름[시작인덱스 : 끝인덱스 : 간격]
간격(step)
을 지정하면 해당 간격만큼 건너뛰며 요소를 추출합니다.
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 인덱스: 0 1 2 3 4 5 6 7 8 9
# 인덱스 2부터 5 전까지 (2, 3, 4번 인덱스)
sub1 = numbers[2:5]
print(f"numbers[2:5] -> {sub1}") # 출력: [2, 3, 4]
# 처음부터 3 전까지 (0, 1, 2번 인덱스)
sub2 = numbers[:3]
print(f"numbers[:3] -> {sub2}") # 출력: [0, 1, 2]
# 인덱스 6부터 끝까지
sub3 = numbers[6:]
print(f"numbers[6:] -> {sub3}") # 출력: [6, 7, 8, 9]
# 처음부터 끝까지 2칸 간격으로 (짝수만)
sub4 = numbers[::2]
print(f"numbers[::2] -> {sub4}") # 출력: [0, 2, 4, 6, 8]
# 리스트 전체 복사 (슬라이싱 이용)
numbers_copy = numbers[:]
print(f"numbers[:] -> {numbers_copy}")
슬라이싱은 원본 리스트를 변경하지 않고 새로운 부분 리스트를 만들어 반환합니다.
5. 리스트 다루는 유용한 기능들
len(리스트)
: 리스트에 포함된 요소의 개수(길이)를 반환합니다.리스트.append(값)
: 리스트의 맨 뒤에 새로운 값을 추가합니다. (메소드 - 리스트 변수 뒤에 점.
을 찍고 사용)sum(숫자리스트)
: 숫자들로 이루어진 리스트의 모든 요소의 합계를 반환합니다.min(숫자리스트)
: 숫자 리스트에서 가장 작은 값을 반환합니다.max(숫자리스트)
: 숫자 리스트에서 가장 큰 값을 반환합니다.- 리스트 + 리스트: 두 리스트를 이어 붙여 새로운 리스트를 만듭니다.
값 in 리스트
: 특정 값이 리스트 안에 포함되어 있는지 확인하여True
또는False
를 반환합니다.
scores = [85, 92, 78, 100, 95]
# 리스트 길이
print(f"점수 개수: {len(scores)}") # 출력: 5
# 요소 추가
scores.append(88) # 리스트 맨 뒤에 88 추가
print(f"점수 추가 후: {scores}") # 출력: [85, 92, 78, 100, 95, 88]
print(f"변경된 개수: {len(scores)}") # 출력: 6
# 합계, 최솟값, 최댓값
total_score = sum(scores)
min_score = min(scores)
max_score = max(scores)
print(f"총점: {total_score}")
print(f"최저 점수: {min_score}")
print(f"최고 점수: {max_score}")
# 평균 계산
average_score = total_score / len(scores)
print(f"평균 점수: {average_score:.2f}") # 소수점 2자리까지 출력
# 리스트 연결
list1 = [1, 2, 3]
list2 = [4, 5]
combined_list = list1 + list2
print(f"리스트 연결: {combined_list}") # 출력: [1, 2, 3, 4, 5]
# 요소 포함 여부 확인
print(f"100점이 리스트에 있나요? {100 in scores}") # True
print(f"50점이 리스트에 있나요? {50 in scores}") # False
6. 리스트와 반복문 (for
)
for
반복문은 리스트의 각 요소를 순서대로 하나씩 꺼내어 처리하는 데 매우 유용합니다.
fruits = ["apple", "banana", "cherry"]
# 리스트의 모든 과일 이름 출력하기
print("과일 목록:")
for fruit in fruits: # fruit 변수가 'apple', 'banana', 'cherry' 순서로 값을 받음
print(fruit)
# 점수 리스트에서 80점 이상인 점수만 출력하기
scores = [85, 92, 78, 100, 95, 88, 75]
print("\n80점 이상인 점수:")
for score in scores:
if score >= 80:
print(score)
수학 문제에 적용하기
리스트는 다양한 수학 데이터를 저장하고 처리하는 데 필수적입니다.
- 데이터 집합 관리: 학생들의 점수 목록, 실험 측정값, 조사 결과 등을 리스트에 저장하여 관리합니다.
- 통계 계산: 리스트에 저장된 데이터의 합계, 평균, 최댓값, 최솟값 등을 계산합니다. (예: 학생들 평균 키 계산)
- 좌표 표현: 2차원 좌표
[x, y]
를 리스트로 표현하고, 여러 개의 좌표들을 리스트의 리스트[[x1, y1], [x2, y2], ...]
로 저장하여 도형 정보를 다룰 수 있습니다. (Chapter 9에서 활용) - 다항식 계수 표현:
[3, -5, 2]
와 같이 다항식의 계수를 저장하여 다항식 계산에 활용합니다. (Chapter 7에서 활용) - 수열 저장: 등차수열, 등비수열 등의 항들을 계산하여 리스트에 저장하고 분석합니다. (Chapter 10에서 활용)
직접 해보기 (Follow Along Exercise)
- 좋아하는 숫자 5개를 포함하는 리스트
fav_numbers
를 만드세요. len()
함수를 이용해 리스트의 길이를 출력하세요.append()
메소드를 이용해 리스트 끝에 숫자 하나를 더 추가하세요.sum()
,len()
을 이용하여 리스트에 있는 숫자들의 평균을 계산하고 출력하세요.- 리스트의 첫 번째 요소와 마지막 요소를 출력하세요.
# 직접 코드를 작성하고 실행해보세요!
fav_numbers = [7, 11, 3, 25, 42]
print(f"리스트 길이: {len(fav_numbers)}")
fav_numbers.append(100)
print(f"추가 후 리스트: {fav_numbers}")
average = sum(fav_numbers) / len(fav_numbers)
print(f"평균: {average}")
print(f"첫 번째 요소: {fav_numbers[0]}")
print(f"마지막 요소: {fav_numbers[-1]}")
연습 문제
1부터 10까지의 정수를 요소로 가지는 리스트
numbers_1_to_10
을 만드세요. (range()
와list()
함수를 함께 사용하면 편리합니다:list(range(1, 11))
)위 리스트
numbers_1_to_10
에서 슬라이싱을 이용하여 다음 부분 리스트들을 추출하여 출력하세요.- 인덱스 3부터 7까지의 요소들 (
[3, 4, 5, 6, 7]
) - 리스트의 마지막 3개 요소
- 리스트의 모든 홀수 요소 (
[1, 3, 5, 7, 9]
)
- 인덱스 3부터 7까지의 요소들 (
5명의 친구 이름을 저장한 리스트
friends
를 만들고,for
반복문을 이용하여 각 친구의 이름을 "안녕, [이름]!" 형식으로 출력하세요.10개의 임의의 점수(0~100 사이 정수)를 포함하는 리스트를 만들고 (
random.randint(0, 100)
10번 사용 -import random
필요), 이 리스트에서 최댓값과 최솟값을 찾아 출력하는 프로그램을 작성하세요. (min()
,max()
사용)
COMMENTS