Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료
Python 프로그래밍Unit 4: 자료구조 마스터Topic 2: 리스트 메서드와 활용

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. [1, 2, 3, 4, 5]
  2. [1, 2, 3, [4, 5]]
  3. [1, 2, 3, 4, [5]]
  4. 오류 발생

💡 정답 확인

정답: 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])
  1. list1: [1, 2, 3, [4, 5]], list2: [1, 2, 3, 4, 5]
  2. list1: [1, 2, 3, 4, 5], list2: [1, 2, 3, [4, 5]]
  3. 둘 다 [1, 2, 3, 4, 5]
  4. 둘 다 [1, 2, 3, [4, 5]]

💡 정답 확인

정답: 1번

  • append(): 인수를 하나의 요소로 추가
  • extend(): 인수의 각 요소를 개별적으로 추가

Q3. 다음 코드의 출력 결과는?

numbers = [3, 1, 4, 2] result = numbers.sort() print(result)
  1. [1, 2, 3, 4]
  2. [3, 1, 4, 2]
  3. None
  4. 오류 발생

💡 정답 확인

정답: 3번 (None)

sort() 메서드는 원본 리스트를 직접 수정하고 None을 반환합니다. 정렬된 리스트를 얻으려면 sorted() 함수를 사용해야 합니다.

Q4. 원본 리스트를 보존하면서 정렬하려면?

original = [3, 1, 4, 2]
  1. original.sort()
  2. sorted(original)
  3. original.reverse()
  4. 1번과 2번 모두

💡 정답 확인

정답: 2번 (sorted(original))

sorted() 함수는 원본을 변경하지 않고 새로운 정렬된 리스트를 반환합니다.

✅ 리스트 메서드 마스터 체크리스트

✅ 리스트 메서드 마스터 체크리스트

🎉 리스트 메서드 마스터 완성!

리스트의 모든 주요 메서드를 학습하고 실제 활용까지 익혔습니다!

🏆 이번 토픽에서 배운 내용

  1. 추가 메서드: append, insert, extend
  2. 제거 메서드: remove, pop, clear
  3. 찾기 메서드: index, count
  4. 정렬 메서드: sort, reverse
  5. 복사 메서드: copy
  6. 리스트 컴프리헨션: 간결한 리스트 생성

🚀 이제 할 수 있는 것들

  • 리스트에 데이터를 자유자재로 추가/제거
  • 원하는 조건에 맞게 데이터 정렬
  • 데이터 검색과 빈도 분석
  • 실용적인 데이터 관리 프로그램 작성

다음 토픽에서는 튜플을 배워서 변경할 수 없는 데이터 모음을 다루는 방법을 알아보겠습니다! 🚀

Last updated on