Topic 2: 리스트 메서드와 활용 - 리스트 조작의 달인 🛠️
🎯 학습 목표
리스트의 다양한 메서드를 활용하여 데이터를 추가, 삭제, 정렬하고 실제 문제 해결에 리스트를 효과적으로 활용할 수 있습니다.
📋 메서드란?
메서드의 개념
메서드는 리스트가 가지고 있는 기능들입니다. 마치 스마트폰의 앱처럼, 리스트도 다양한 기능을 내장하고 있어요.
# 메서드 사용 방법
리스트.메서드명()
메서드 vs 함수
# 함수 사용
numbers = [3, 1, 4, 1, 5]
length = len(numbers) # 함수
# 메서드 사용
numbers.append(9) # 메서드
numbers.sort() # 메서드
➕ 요소 추가 메서드
append() - 끝에 추가
fruits = ["사과", "바나나"]
fruits.append("오렌지")
print(fruits) # ["사과", "바나나", "오렌지"]
# 숫자도 추가 가능
numbers = [1, 2, 3]
numbers.append(4)
print(numbers) # [1, 2, 3, 4]
insert() - 특정 위치에 추가
fruits = ["사과", "바나나", "오렌지"]
fruits.insert(1, "딸기") # 1번 위치에 삽입
print(fruits) # ["사과", "딸기", "바나나", "오렌지"]
# 맨 앞에 추가
fruits.insert(0, "포도")
print(fruits) # ["포도", "사과", "딸기", "바나나", "오렌지"]
extend() - 여러 요소 추가
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
numbers1.extend(numbers2)
print(numbers1) # [1, 2, 3, 4, 5, 6]
# 문자열도 확장 가능
letters = ["a", "b"]
letters.extend("cd")
print(letters) # ["a", "b", "c", "d"]
➖ 요소 제거 메서드
remove() - 값으로 제거
fruits = ["사과", "바나나", "오렌지", "바나나"]
fruits.remove("바나나") # 첫 번째 바나나만 제거
print(fruits) # ["사과", "오렌지", "바나나"]
pop() - 위치로 제거
fruits = ["사과", "바나나", "오렌지"]
# 마지막 요소 제거하고 반환
last_fruit = fruits.pop()
print(last_fruit) # "오렌지"
print(fruits) # ["사과", "바나나"]
# 특정 위치 제거
first_fruit = fruits.pop(0)
print(first_fruit) # "사과"
print(fruits) # ["바나나"]
clear() - 모든 요소 제거
numbers = [1, 2, 3, 4, 5]
numbers.clear()
print(numbers) # []
del 키워드 - 인덱스로 제거
fruits = ["사과", "바나나", "오렌지", "포도"]
# 특정 인덱스의 요소 제거
del fruits[1] # "바나나" 제거
print(fruits) # ["사과", "오렌지", "포도"]
# 슬라이싱으로 여러 요소 제거
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
del numbers[2:5] # 인덱스 2부터 4까지 제거
print(numbers) # [1, 2, 6, 7, 8, 9]
# 리스트 전체 제거 (변수 자체를 삭제)
temp_list = [1, 2, 3]
del temp_list # 변수 자체를 삭제
# print(temp_list) # 오류! 변수가 존재하지 않음
del vs remove() vs pop() 비교:
numbers = [1, 2, 3, 2, 4, 2, 5]
# del: 인덱스로 제거
del numbers[0] # 인덱스 0 제거
print(numbers) # [2, 3, 2, 4, 2, 5]
# remove(): 값으로 제거 (첫 번째 일치하는 값만)
numbers.remove(2) # 첫 번째 2 제거
print(numbers) # [3, 2, 4, 2, 5]
# pop(): 인덱스로 제거하고 값 반환
removed = numbers.pop(1) # 인덱스 1 제거
print(f"제거된 값: {removed}") # 제거된 값: 2
print(numbers) # [3, 4, 2, 5]
🔍 요소 찾기 메서드
index() - 위치 찾기
fruits = ["사과", "바나나", "오렌지", "바나나"]
position = fruits.index("바나나")
print(position) # 1 (첫 번째 바나나의 위치)
# 특정 범위에서 찾기
position = fruits.index("바나나", 2) # 2번째 위치부터 찾기
print(position) # 3
count() - 개수 세기
numbers = [1, 2, 3, 2, 4, 2, 5]
count = numbers.count(2)
print(count) # 3
fruits = ["사과", "바나나", "사과", "오렌지"]
apple_count = fruits.count("사과")
print(apple_count) # 2
🔄 리스트 정렬과 순서
sort() vs sorted() - 정렬의 두 가지 방법
sort() 메서드 - 원본 수정
# 숫자 정렬 (원본 리스트가 변경됨)
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"정렬 전: {numbers}")
numbers.sort() # 원본을 직접 수정
print(f"정렬 후: {numbers}") # [1, 1, 2, 3, 4, 5, 6, 9]
# 역순 정렬
numbers.sort(reverse=True)
print(f"역순 정렬: {numbers}") # [9, 6, 5, 4, 3, 2, 1, 1]
# ⚠️ 주의: sort()는 None을 반환합니다!
result = numbers.sort()
print(f"sort() 반환값: {result}") # None
sorted() 함수 - 새로운 리스트 생성
# 원본은 그대로, 새로운 정렬된 리스트 생성
original = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_list = sorted(original)
print(f"원본: {original}") # [3, 1, 4, 1, 5, 9, 2, 6] (변경 안됨)
print(f"정렬된 리스트: {sorted_list}") # [1, 1, 2, 3, 4, 5, 6, 9]
# 역순 정렬
reverse_sorted = sorted(original, reverse=True)
print(f"역순 정렬: {reverse_sorted}") # [9, 6, 5, 4, 3, 2, 1, 1]
언제 어떤 것을 사용할까?
# sort() 사용 - 원본을 바꿔도 되는 경우
scores = [85, 92, 78, 96, 88]
scores.sort(reverse=True) # 높은 점수부터 정렬
print(f"성적 순위: {scores}")
# sorted() 사용 - 원본을 보존해야 하는 경우
original_scores = [85, 92, 78, 96, 88]
ranking = sorted(original_scores, reverse=True)
print(f"원본 점수: {original_scores}") # 원본 그대로
print(f"순위: {ranking}") # 정렬된 버전
reverse() - 순서 뒤집기
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers) # [5, 4, 3, 2, 1]
📊 리스트 복사
copy() - 복사 생성
original = [1, 2, 3, 4, 5]
copied = original.copy()
# 복사본 수정
copied.append(6)
print(original) # [1, 2, 3, 4, 5] (원본 그대로)
print(copied) # [1, 2, 3, 4, 5, 6] (복사본만 변경)
참조 vs 복사의 차이
# 참조 (같은 리스트를 가리킴 - 위험!)
list1 = [1, 2, 3]
list2 = list1 # list2는 list1과 같은 리스트를 가리킴
list2.append(4)
print(list1) # [1, 2, 3, 4] (원본도 변경됨!)
print(list2) # [1, 2, 3, 4]
# 복사 (새로운 리스트 생성 - 안전!)
list1 = [1, 2, 3]
list2 = list1.copy() # 새로운 리스트 생성
list2.append(4)
print(list1) # [1, 2, 3] (원본 그대로)
print(list2) # [1, 2, 3, 4] (복사본만 변경)
🎯 실용적인 활용 예시
예시 1: 학생 성적 관리 시스템
# 학생 이름과 점수
students = ["김철수", "이영희", "박민수"]
scores = [85, 92, 78]
# 새 학생 추가
students.append("최지영")
scores.append(96)
print(f"학생 명단: {students}")
print(f"점수 목록: {scores}")
# 성적 통계
print(f"\n📊 성적 통계")
print(f"평균: {sum(scores)/len(scores):.1f}")
print(f"최고점: {max(scores)}")
print(f"최저점: {min(scores)}")
# 점수 순으로 정렬
sorted_scores = scores.copy()
sorted_scores.sort(reverse=True)
print(f"점수 순위: {sorted_scores}")
예시 2: 할 일 관리하기
# 할 일 목록
todo_list = ["숙제하기", "운동하기", "독서하기"]
print("📋 현재 할 일 목록:")
print(todo_list)
# 새로운 할 일 추가
todo_list.append("쇼핑하기")
print(f"\n할 일 추가 후: {todo_list}")
# 완료한 일 제거
todo_list.remove("숙제하기")
print(f"숙제 완료 후: {todo_list}")
# 목록 길이 확인
print(f"남은 할 일: {len(todo_list)}개")
# 특정 할 일 확인
if "운동하기" in todo_list:
print("운동하기가 목록에 있습니다!")
예시 3: 과일 개수 세기
# 과일 목록
fruits = ["사과", "바나나", "사과", "오렌지", "사과", "바나나"]
print("📊 과일 목록:")
print(fruits)
# 특정 과일 개수 세기
apple_count = fruits.count("사과")
banana_count = fruits.count("바나나")
orange_count = fruits.count("오렌지")
print(f"\n과일 개수:")
print(f"사과: {apple_count}개")
print(f"바나나: {banana_count}개")
print(f"오렌지: {orange_count}개")
# 가장 많은 과일 찾기
if apple_count > banana_count and apple_count > orange_count:
print("사과가 가장 많습니다!")
🔄 메서드 체이닝
여러 메서드를 연결해서 사용하기
# 숫자 리스트 만들기
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# 복사본 만들고 정렬하기
sorted_numbers = numbers.copy()
sorted_numbers.sort()
print(f"원본: {numbers}")
print(f"정렬된 복사본: {sorted_numbers}")
# 리스트 조작 연속하기
fruits = ["사과", "바나나"]
fruits.append("오렌지")
fruits.append("포도")
fruits.remove("바나나")
print(f"최종 과일 목록: {fruits}")
🚨 자주 발생하는 오류
오류 1: 존재하지 않는 값 제거
# ❌ 틀린 예
fruits = ["사과", "바나나", "오렌지"]
fruits.remove("포도") # ValueError: list.remove(x): x not in list
# ✅ 올바른 예
fruits = ["사과", "바나나", "오렌지"]
if "포도" in fruits:
fruits.remove("포도")
else:
print("포도가 목록에 없습니다.")
오류 2: 잘못된 인덱스 사용
# ❌ 틀린 예
fruits = ["사과", "바나나", "오렌지"]
fruits.insert(10, "포도") # 인덱스 10은 너무 큰 값
print(fruits) # ["사과", "바나나", "오렌지", "포도"] - 맨 끝에 추가됨
# ✅ 올바른 예
fruits = ["사과", "바나나", "오렌지"]
fruits.insert(1, "포도") # 적절한 인덱스 사용
print(fruits) # ["사과", "포도", "바나나", "오렌지"]
💡 퀴즈: 리스트 메서드 이해도 체크
Q1. 다음 코드의 실행 결과는?
numbers = [1, 2, 3]
numbers.append([4, 5])
print(numbers)
- [1, 2, 3, 4, 5]
- [1, 2, 3, [4, 5]]
- [1, 2, 3, 4, [5]]
- 오류 발생
💡 정답 확인
정답: 2번 ([1, 2, 3, [4, 5]])
append()는 인수를 하나의 요소로 추가합니다. 리스트 전체가 하나의 요소로 추가됩니다.
Q2. extend()와 append()의 차이점은?
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list1.append([4, 5])
list2.extend([4, 5])
- list1: [1, 2, 3, [4, 5]], list2: [1, 2, 3, 4, 5]
- list1: [1, 2, 3, 4, 5], list2: [1, 2, 3, [4, 5]]
- 둘 다 [1, 2, 3, 4, 5]
- 둘 다 [1, 2, 3, [4, 5]]
💡 정답 확인
정답: 1번
- append(): 인수를 하나의 요소로 추가
- extend(): 인수의 각 요소를 개별적으로 추가
Q3. 다음 코드의 출력 결과는?
numbers = [3, 1, 4, 2]
result = numbers.sort()
print(result)
- [1, 2, 3, 4]
- [3, 1, 4, 2]
- None
- 오류 발생
💡 정답 확인
정답: 3번 (None)
sort() 메서드는 원본 리스트를 직접 수정하고 None을 반환합니다. 정렬된 리스트를 얻으려면 sorted() 함수를 사용해야 합니다.
Q4. 원본 리스트를 보존하면서 정렬하려면?
original = [3, 1, 4, 2]
- original.sort()
- sorted(original)
- original.reverse()
- 1번과 2번 모두
💡 정답 확인
정답: 2번 (sorted(original))
sorted() 함수는 원본을 변경하지 않고 새로운 정렬된 리스트를 반환합니다.
✅ 리스트 메서드 마스터 체크리스트
✅ 리스트 메서드 마스터 체크리스트
🎉 리스트 메서드 마스터 완성!
리스트의 모든 주요 메서드를 학습하고 실제 활용까지 익혔습니다!
🏆 이번 토픽에서 배운 내용
- 추가 메서드: append, insert, extend
- 제거 메서드: remove, pop, clear
- 찾기 메서드: index, count
- 정렬 메서드: sort, reverse
- 복사 메서드: copy
- 리스트 컴프리헨션: 간결한 리스트 생성
🚀 이제 할 수 있는 것들
- 리스트에 데이터를 자유자재로 추가/제거
- 원하는 조건에 맞게 데이터 정렬
- 데이터 검색과 빈도 분석
- 실용적인 데이터 관리 프로그램 작성
다음 토픽에서는 튜플을 배워서 변경할 수 없는 데이터 모음을 다루는 방법을 알아보겠습니다! 🚀
Last updated on