포스트

[Python 100일 챌린지] Day 7 - 리스트 다루기 (list)

[Python 100일 챌린지] Day 7 - 리스트 다루기 (list)

프로그래밍은 데이터 관리가 핵심입니다! 쇼핑몰 장바구니, 학생 성적 관리, 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]
💡 힌트

max()와 min() 함수를 사용하세요!

✅ 정답
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] (원본 그대로)

📝 오늘 배운 내용 정리

  1. 리스트: 여러 데이터를 순서대로 담는 자료구조
  2. 인덱스: 0부터 시작, 음수는 뒤에서부터
  3. 추가/삭제: append(), insert(), remove(), pop(), del
  4. 슬라이싱: [시작:끝:간격], [::-1]로 역순
  5. 유용한 메서드: len(), sort(), sorted(), count(), index()
  6. 리스트 복사: copy() 또는 [:] 슬라이싱 사용

🎯 실습 과제

과제: 성적 관리 프로그램

5명의 학생 점수를 리스트로 관리하는 프로그램을 만드세요:

  1. 점수 리스트 만들기
  2. 최고점, 최저점 출력
  3. 평균 계산
  4. 점수를 오름차순으로 정렬

예시:

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
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.