파이썬 리스트를 더 효율적으로 다루는 방법들을 알아보겠습니다.
특히 실무에서 자주 사용되는 in 연산자와 다양한 리스트 메소드들을 예제와 함께 살펴보겠습니다.
1. 리스트에서 값의 존재 확인하기
프로그래밍을 하다 보면 특정 값이 리스트에 포함되어 있는지 확인해야 할 때가 많습니다.
먼저 직접 함수를 만들어 보고, 파이썬의 내장 기능을 활용하는 방법을 알아보겠습니다.
[방법 1] 함수를 직접 구현하기
# 특정 값이 리스트에 있는지 확인하는 함수
def check_item(my_list, target):
i = 0
while i < len(my_list):
# 리스트에서 target을 찾으면 True 반환
if my_list[i] == target:
return True
i = i + 1
# 리스트 전체를 확인했는데 못 찾으면 False 반환
return False
# 테스트
fruits = ["사과", "바나나", "오렌지", "포도", "딸기"]
print(check_item(fruits, "오렌지")) # True
print(check_item(fruits, "수박")) # False
이 함수는 리스트를 처음부터 끝까지 순회하면서 찾고자 하는 값이 있는지 확인합니다.
값을 찾으면 즉시 True를 반환하고, 끝까지 못 찾으면 False를 반환하는 구조입니다.
[방법 2] in 연산자 사용하기 (추천!)
파이썬에서는 이런 기능을 간단하게 구현할 수 있도록 in 연산자를 제공합니다:
fruits = ["사과", "바나나", "오렌지", "포도", "딸기"]
print("오렌지" in fruits) # True
print("수박" in fruits) # False
💡 Tip: not in 연산자로 없는지 확인하기
반대로 값이 리스트에 없는지 확인하고 싶다면 not in을 사용하세요:
fruits = ["사과", "바나나", "오렌지", "포도", "딸기"]
print("오렌지" not in fruits) # False (오렌지가 있으므로)
print("수박" not in fruits) # True (수박이 없으므로)
in 연산자는 코드를 더 읽기 쉽게 만들어주고, 파이썬 내부적으로 최적화되어 있어 성능도 우수합니다.
2. 리스트 안의 리스트 (중첩 리스트)
리스트는 다양한 타입의 데이터를 담을 수 있는데, 심지어 다른 리스트도 담을 수 있습니다. 이를 중첩 리스트(Nested List) 라고 부릅니다.
실전 예제: 학생별 과목 점수 관리
# 3명의 학생이 각각 국어, 영어, 수학 점수를 가지고 있음
student_scores = [
[85, 90, 88], # 학생1: 국어, 영어, 수학
[92, 88, 95], # 학생2: 국어, 영어, 수학
[78, 85, 82] # 학생3: 국어, 영어, 수학
]
# 두 번째 학생의 전체 성적
print(student_scores[1]) # [92, 88, 95]
# 첫 번째 학생의 성적
print(student_scores[0]) # [85, 90, 88]
# 두 번째 학생의 영어 점수 (인덱스: [1][1])
print(student_scores[1][1]) # 88
# 세 번째 학생의 수학 점수 (인덱스: [2][2])
print(student_scores[2][2]) # 82
# 국어 과목의 평균 점수 계산
korean_avg = (student_scores[0][0] + student_scores[1][0] + student_scores[2][0]) / 3
print(f"국어 평균: {korean_avg:.1f}점") # 85.0점
중첩 리스트에 접근할 때는 대괄호를 연속으로 사용합니다. 첫 번째 대괄호는 외부 리스트의 인덱스, 두 번째 대괄호는 내부 리스트의 인덱스를 나타냅니다.
3. 리스트를 더 강력하게: 필수 메소드들
1️⃣ sort() 메소드 - 리스트 정렬하기
sort() 메소드는 리스트를 직접 정렬합니다. 새로운 리스트를 만들지 않고 원본을 변경한다는 점이 중요합니다:
scores = [88, 92, 75, 90, 83]
scores.sort()
print(scores) # [75, 83, 88, 90, 92]
# 내림차순 정렬
scores.sort(reverse=True)
print(scores) # [92, 90, 88, 83, 75]
2️⃣ reverse() 메소드 - 리스트 뒤집기
reverse() 메소드는 리스트의 순서를 완전히 뒤집습니다:
weekdays = ["월", "화", "수", "목", "금"]
weekdays.reverse()
print(weekdays) # ['금', '목', '수', '화', '월']
3️⃣ index() 메소드 - 값의 위치 찾기
특정 값이 리스트의 몇 번째 위치에 있는지 찾을 때 사용합니다:
colors = ["빨강", "파랑", "노랑", "초록", "보라"]
print(colors.index("노랑")) # 2
print(colors.index("초록")) # 3
# 만약 없는 값을 찾으면 에러가 발생합니다
# print(colors.index("검정")) # ValueError 발생!
💡 Tip: index() 사용 전에 in 연산자로 먼저 확인하면 안전합니다:
if "검정" in colors:
print(colors.index("검정"))
else:
print("검정색은 리스트에 없습니다")
4️⃣ remove() 메소드 - 값으로 삭제하기
remove() 메소드는 특정 값을 가진 첫 번째 요소를 삭제합니다:
shopping_list = ["우유", "계란", "빵", "과자", "빵", "음료수"]
shopping_list.remove("빵") # 첫 번째 "빵"만 삭제
print(shopping_list) # ['우유', '계란', '과자', '빵', '음료수']
# 모든 "빵"을 삭제하려면 반복문 사용
while "빵" in shopping_list:
shopping_list.remove("빵")
print(shopping_list) # ['우유', '계란', '과자', '음료수']
4. 정리 & 실전 팁
- in 연산자: 리스트에 특정 값이 있는지 확인할 때 가장 파이썬스러운 방법
- 중첩 리스트: 2차원 데이터를 다룰 때 유용 (표, 행렬 등)
- 리스트 메소드들: 원본을 변경하는 메소드(sort, reverse, remove)와 정보를 반환하는 메소드(index)의 차이를 이해하기
실전에서 자주 하는 실수들
1. sort()와 sorted()를 혼동하기 (sort는 원본 변경, sorted는 새 리스트 반환)
2. 없는 값에 index()를 사용해서 에러 발생
3. remove()가 모든 값을 삭제한다고 착각하기 (첫 번째 값만 삭제)