프로그래밍은 데이터 관리가 핵심입니다! 쇼핑몰 장바구니, 학생 성적 관리, SNS 친구 목록, 음악 플레이리스트… 😊 실무에서 단일 데이터만 다루는 경우는 거의 없습니다. 여러 데이터를 효율적으로 관리하는 리스트는 Python에서 가장 많이 사용하는 자료구조입니다. 오늘 배우는 리스트 조작 기술은 앞으로 매일 사용하게 될 거예요!
(15분 완독 ⭐⭐)
🎯 오늘의 학습 목표
📚 사전 지식
🎯 학습 목표 1: 리스트(list)가 무엇인지 이해하기
한 줄 설명
리스트 = 여러 개의 데이터를 순서대로 담는 상자
마치 장바구니에 물건을 담듯이, 리스트에는 여러 값을 담을 수 있습니다.
실생활 비유
1
2
3
4
5
6
7
8
9
10
| 📋 쇼핑 리스트:
[0] 사과
[1] 바나나
[2] 우유
[3] 빵
👥 학생 명단:
[0] 홍길동
[1] 김철수
[2] 이영희
|
🎯 학습 목표 2: 리스트 만들고 사용하기
기본 문법
1
2
3
4
5
6
7
8
9
10
11
| # 빈 리스트
empty_list = []
# 숫자 리스트
numbers = [1, 2, 3, 4, 5]
# 문자열 리스트
fruits = ["사과", "바나나", "포도"]
# 섞인 리스트 (가능하지만 권장하지 않음)
mixed = [1, "apple", 3.14, True]
|
리스트 출력하기
1
2
3
4
| fruits = ["사과", "바나나", "포도"]
print(fruits) # ['사과', '바나나', '포도']
print(type(fruits)) # <class 'list'>
|
🎯 학습 목표 3: 리스트에 데이터 추가/삭제하기
요소 추가 (append)
리스트 끝에 추가
1
2
3
4
5
6
7
8
| fruits = ["사과", "바나나"]
# 끝에 추가
fruits.append("포도")
print(fruits) # ['사과', '바나나', '포도']
fruits.append("딸기")
print(fruits) # ['사과', '바나나', '포도', '딸기']
|
특정 위치에 추가 (insert)
1
2
3
4
5
| fruits = ["사과", "포도"]
# 1번 위치에 추가
fruits.insert(1, "바나나")
print(fruits) # ['사과', '바나나', '포도']
|
요소 삭제 (remove)
값으로 삭제
1
2
3
4
5
| fruits = ["사과", "바나나", "포도"]
# "바나나" 삭제
fruits.remove("바나나")
print(fruits) # ['사과', '포도']
|
인덱스로 삭제 (del, pop)
1
2
3
4
5
6
7
8
9
10
| fruits = ["사과", "바나나", "포도", "딸기"]
# del로 삭제
del fruits[1]
print(fruits) # ['사과', '포도', '딸기']
# pop으로 삭제하고 값 가져오기
last = fruits.pop()
print(last) # 딸기
print(fruits) # ['사과', '포도']
|
🎯 학습 목표 4: 리스트 인덱스와 슬라이싱 배우기
인덱스란?
인덱스 = 리스트 안에서의 위치 번호 (0부터 시작!)
1
2
| fruits = ["사과", "바나나", "포도", "딸기"]
# [0] [1] [2] [3]
|
요소 가져오기
1
2
3
4
5
6
7
8
9
10
| fruits = ["사과", "바나나", "포도", "딸기"]
# 첫 번째 요소
print(fruits[0]) # 사과
# 두 번째 요소
print(fruits[1]) # 바나나
# 마지막 요소
print(fruits[3]) # 딸기
|
음수 인덱스
뒤에서부터 세기
1
2
3
4
5
| fruits = ["사과", "바나나", "포도", "딸기"]
# [-4] [-3] [-2] [-1]
print(fruits[-1]) # 딸기 (마지막)
print(fruits[-2]) # 포도 (뒤에서 두 번째)
|
슬라이싱 - 일부분 가져오기
1
2
3
4
5
6
7
8
| numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [시작:끝] - 끝은 포함 안 함!
print(numbers[0:3]) # [0, 1, 2]
print(numbers[2:5]) # [2, 3, 4]
print(numbers[5:]) # [5, 6, 7, 8, 9]
print(numbers[:4]) # [0, 1, 2, 3]
print(numbers[-3:]) # [7, 8, 9]
|
슬라이싱 응용
1
2
3
4
5
6
7
| numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [시작:끝:간격]
print(numbers[0:10:2]) # [0, 2, 4, 6, 8] (짝수)
print(numbers[1:10:2]) # [1, 3, 5, 7, 9] (홀수)
print(numbers[::3]) # [0, 3, 6, 9] (3칸씩)
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] (역순)
|
💻 실습 예제
예제 1: 성적 리스트
1
2
3
4
5
6
7
8
9
10
11
| # 5명의 점수
scores = [85, 90, 78, 92, 88]
print("첫 번째 학생:", scores[0])
print("두 번째 학생:", scores[1])
print("마지막 학생:", scores[-1])
# 평균 구하기
total = scores[0] + scores[1] + scores[2] + scores[3] + scores[4]
average = total / 5
print(f"평균: {average}")
|
출력:
1
2
3
4
| 첫 번째 학생: 85
두 번째 학생: 90
마지막 학생: 88
평균: 86.6
|
예제 2: 할 일 목록
1
2
3
4
5
6
| todos = ["청소하기", "공부하기", "운동하기"]
print("📋 오늘의 할 일:")
print(f"1. {todos[0]}")
print(f"2. {todos[1]}")
print(f"3. {todos[2]}")
|
출력:
1
2
3
4
| 📋 오늘의 할 일:
1. 청소하기
2. 공부하기
3. 운동하기
|
🎯 학습 목표 5: 유용한 리스트 메서드 사용하기
길이 구하기 (len)
1
2
3
| fruits = ["사과", "바나나", "포도"]
length = len(fruits)
print(f"과일 개수: {length}") # 과일 개수: 3
|
정렬하기 (sort)
1
2
3
4
5
6
7
8
9
| numbers = [3, 1, 4, 1, 5, 9, 2]
# 오름차순 정렬
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# 내림차순 정렬
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
|
포함 여부 확인 (in)
1
2
3
4
5
6
7
8
| fruits = ["사과", "바나나", "포도"]
print("사과" in fruits) # True
print("딸기" in fruits) # False
# 조건문과 함께 사용
if "바나나" in fruits:
print("바나나가 있습니다!")
|
개수 세기 (count)
1
2
3
| numbers = [1, 2, 3, 2, 4, 2, 5]
count = numbers.count(2)
print(f"2의 개수: {count}") # 2의 개수: 3
|
위치 찾기 (index)
1
2
3
| fruits = ["사과", "바나나", "포도"]
position = fruits.index("바나나")
print(f"바나나의 위치: {position}") # 바나나의 위치: 1
|
🎯 학습 목표 6: 리스트 복사 이해하기
얕은 복사 주의!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # ❌ 잘못된 복사
list1 = [1, 2, 3]
list2 = list1 # 같은 리스트를 가리킴
list2[0] = 99
print(list1) # [99, 2, 3] - 같이 변경됨!
# ✅ 올바른 복사
list1 = [1, 2, 3]
list2 = list1.copy() # 새로운 리스트 생성
list2[0] = 99
print(list1) # [1, 2, 3] - 원본 그대로
print(list2) # [99, 2, 3]
|
💡 복사 방법 비교
list2 = list1: 같은 리스트를 가리킴 (복사 아님!) list2 = list1.copy(): 새로운 리스트 생성 (얕은 복사) list2 = list1[:]: 슬라이싱으로 복사 (얕은 복사)
💡 실전 팁 & 주의사항
💡 Tip 1: 인덱스 범위 주의
1
2
3
4
5
6
7
8
9
10
| fruits = ["사과", "바나나", "포도"]
# ❌ 에러 발생! (범위 초과)
print(fruits[10]) # IndexError: list index out of range
# ✅ 안전하게 확인
if len(fruits) > 10:
print(fruits[10])
else:
print("인덱스가 범위를 벗어났습니다")
|
💡 Tip 2: 빈 리스트 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| empty = []
# ❌ 에러 발생!
print(empty[0]) # IndexError: list index out of range
# ✅ 먼저 확인
if len(empty) > 0:
print(empty[0])
else:
print("리스트가 비어있습니다")
# ✅ 또 다른 방법
if empty: # 빈 리스트는 False
print(empty[0])
else:
print("리스트가 비어있습니다")
|
💡 Tip 3: remove()는 첫 번째만 삭제
1
2
3
| numbers = [1, 2, 3, 2, 4, 2, 5]
numbers.remove(2)
print(numbers) # [1, 3, 2, 4, 2, 5] - 첫 번째 2만 삭제됨!
|
💡 Tip 4: 리스트 합치기 두 가지 방법
1
2
3
4
5
6
7
8
9
10
11
| list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 방법 1: + 연산자 (새 리스트 생성)
combined = list1 + list2
print(combined) # [1, 2, 3, 4, 5, 6]
print(list1) # [1, 2, 3] - 원본 유지
# 방법 2: extend() (원본 수정)
list1.extend(list2)
print(list1) # [1, 2, 3, 4, 5, 6] - 원본 변경됨
|
💡 Tip 5: 리스트 순회 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
| fruits = ["사과", "바나나", "포도"]
# 방법 1: 인덱스로 순회
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# 방법 2: 직접 순회 (더 간결)
for fruit in fruits:
print(fruit)
# 방법 3: enumerate로 인덱스와 값 동시 사용
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
|
💡 Tip 6: sort() vs sorted()
1
2
3
4
5
6
7
8
9
10
11
| numbers = [3, 1, 4, 1, 5]
# sort(): 원본 리스트를 정렬 (반환값 없음)
numbers.sort()
print(numbers) # [1, 1, 3, 4, 5]
# sorted(): 새로운 정렬된 리스트 반환 (원본 유지)
numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5] - 원본 그대로
|
🧪 연습 문제
문제 1: 최댓값, 최솟값 찾기
다음 점수에서 최고점과 최저점을 찾으세요.
1
| scores = [85, 92, 78, 95, 88]
|
💡 힌트
✅ 정답
1
2
3
4
5
6
7
| scores = [85, 92, 78, 95, 88]
highest = max(scores)
lowest = min(scores)
print(f"최고점: {highest}") # 최고점: 95
print(f"최저점: {lowest}") # 최저점: 78
|
문제 2: 쇼핑 리스트 관리
쇼핑 리스트를 만들고, 물건을 추가/삭제해보세요.
💡 힌트
append()로 추가, remove()로 삭제, len()으로 개수 세기!
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 초기 쇼핑 리스트
shopping = ["우유", "빵", "계란"]
print("초기 목록:", shopping)
# 물건 추가
shopping.append("사과")
shopping.append("바나나")
print("추가 후:", shopping)
# 물건 삭제
shopping.remove("빵")
print("삭제 후:", shopping)
# 개수 확인
print(f"총 {len(shopping)}개 물건")
|
출력:
1
2
3
4
| 초기 목록: ['우유', '빵', '계란']
추가 후: ['우유', '빵', '계란', '사과', '바나나']
삭제 후: ['우유', '계란', '사과', '바나나']
총 4개 물건
|
문제 3: 리스트 뒤집기
숫자 리스트를 거꾸로 뒤집어보세요.
💡 힌트
reverse() 메서드나 슬라이싱 [::-1]을 사용하세요!
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
| numbers = [1, 2, 3, 4, 5]
# 방법 1: reverse() 메서드
numbers.reverse()
print(numbers) # [5, 4, 3, 2, 1]
# 방법 2: 슬라이싱 (원본 유지)
numbers = [1, 2, 3, 4, 5]
reversed_numbers = numbers[::-1]
print(reversed_numbers) # [5, 4, 3, 2, 1]
print(numbers) # [1, 2, 3, 4, 5] (원본 그대로)
|
📝 오늘 배운 내용 정리
- 리스트: 여러 데이터를 순서대로 담는 자료구조
- 인덱스: 0부터 시작, 음수는 뒤에서부터
- 추가/삭제: append(), insert(), remove(), pop(), del
- 슬라이싱: [시작:끝:간격], [::-1]로 역순
- 유용한 메서드: len(), sort(), sorted(), count(), index()
- 리스트 복사: copy() 또는 [:] 슬라이싱 사용
🎯 실습 과제
과제: 성적 관리 프로그램
5명의 학생 점수를 리스트로 관리하는 프로그램을 만드세요:
- 점수 리스트 만들기
- 최고점, 최저점 출력
- 평균 계산
- 점수를 오름차순으로 정렬
예시:
1
2
3
4
5
6
7
8
9
10
11
12
13
| scores = [85, 92, 78, 95, 88]
# 최고점, 최저점
print(f"최고점: {max(scores)}")
print(f"최저점: {min(scores)}")
# 평균
average = sum(scores) / len(scores)
print(f"평균: {average}")
# 정렬
scores.sort()
print(f"정렬된 점수: {scores}")
|
🔗 관련 자료
📚 이전 학습
Day 6: 문자열 다루기 ⭐
이전편에서는 문자열(str)을 다루는 방법을 배웠습니다!
📚 다음 학습
Day 8: 조건문 if ⭐⭐
다음편에서는 조건에 따라 다른 동작을 하는 if문을 배웁니다!
“늦었다고 생각할 때가 가장 빠른 시기입니다!” 🚀
| Day 7/100 | Phase 1: Python 시작하기 | #100DaysOfPython |