리스트 CRUD, 슬라이싱, 리스트 컴프리헨션, 튜플과의 차이점
이번 강에서 배울 것
- 리스트(List) 생성, 인덱싱, 슬라이싱
- 리스트 메서드 — append, insert, remove, pop, sort
- 리스트 컴프리헨션(List Comprehension)
- 튜플(Tuple) — 변경 불가한 순서 있는 자료구조
- 리스트 vs 튜플 언제 쓸까
1. 리스트(List)란
리스트는 여러 값을 순서대로 저장하는 자료구조입니다. 대괄호 []로 만들고, 쉼표로 값을 구분합니다. 한 리스트 안에 서로 다른 자료형도 넣을 수 있습니다.
# 리스트 생성
fruits = ["사과", "바나나", "포도", "딸기"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "안녕", 3.14, True, None] # 혼합 가능
empty = [] # 빈 리스트
# 인덱싱 (0부터 시작, 음수는 뒤에서부터)
print(fruits[0]) # → 사과 (첫 번째)
print(fruits[3]) # → 딸기 (네 번째)
print(fruits[-1]) # → 딸기 (마지막)
print(fruits[-2]) # → 포도 (뒤에서 두 번째)
# 슬라이싱 [시작:끝:간격]
print(fruits[1:3]) # → ['바나나', '포도'] (끝 인덱스 미포함)
print(fruits[:2]) # → ['사과', '바나나']
print(fruits[2:]) # → ['포도', '딸기']
print(fruits[::2]) # → ['사과', '포도'] (2칸 간격)
print(fruits[::-1]) # → ['딸기', '포도', '바나나', '사과'] (역순)
# 값 수정
fruits[1] = "망고"
print(fruits) # → ['사과', '망고', '포도', '딸기']
# 리스트 길이
print(len(fruits)) # → 4
2. 리스트 주요 메서드
nums = [3, 1, 4, 1, 5, 9, 2, 6]
# 추가
nums.append(7) # 맨 끝에 추가 → [..., 7]
nums.insert(0, 0) # 인덱스 0에 삽입 → [0, 3, 1, ...]
nums.extend([8, 9]) # 리스트 이어붙이기 (append와 다름)
# 삭제
nums.remove(1) # 값으로 삭제 (첫 번째 1만 삭제)
popped = nums.pop() # 마지막 요소 삭제 후 반환
popped2 = nums.pop(0) # 인덱스 0 요소 삭제 후 반환
del nums[2] # 인덱스로 직접 삭제
# 검색
fruits = ["사과", "바나나", "포도", "바나나"]
print(fruits.index("바나나")) # → 1 (첫 번째 위치)
print(fruits.count("바나나")) # → 2 (몇 개 있나)
print("포도" in fruits) # → True
# 정렬
nums = [3, 1, 4, 1, 5, 9, 2]
nums.sort() # 원본 오름차순 정렬 (반환값 없음)
print(nums) # → [1, 1, 2, 3, 4, 5, 9]
nums.sort(reverse=True) # 내림차순
print(nums) # → [9, 5, 4, 3, 2, 1, 1]
# sorted(): 원본 유지, 정렬된 새 리스트 반환
original = [3, 1, 4, 1, 5]
sorted_list = sorted(original)
print(original) # → [3, 1, 4, 1, 5] (변화 없음)
print(sorted_list) # → [1, 1, 3, 4, 5]
# 기타
nums.reverse() # 역순으로 뒤집기
nums.clear() # 전체 비우기
3. 리스트 컴프리헨션
리스트 컴프리헨션은 한 줄로 리스트를 생성하는 파이썬만의 강력한 문법입니다. for 반복문과 조건문을 리스트 안에 넣어 간결하게 표현합니다.
# 기본 형태: [표현식 for 변수 in 반복대상]
# 일반 방식
squares = []
for x in range(1, 6):
squares.append(x ** 2)
print(squares) # → [1, 4, 9, 16, 25]
# 컴프리헨션으로 한 줄로
squares = [x ** 2 for x in range(1, 6)]
print(squares) # → [1, 4, 9, 16, 25]
# 조건 포함: [표현식 for 변수 in 반복대상 if 조건]
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) # → [2, 4, 6, 8, 10]
# 문자열 처리
names = [" alice ", " BOB ", " Charlie "]
clean = [name.strip().title() for name in names]
print(clean) # → ['Alice', 'Bob', 'Charlie']
# 중첩 컴프리헨션
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(matrix) # → [[1,2,3], [2,4,6], [3,6,9]]
4. 튜플(Tuple)
# 튜플: 소괄호 () 사용, 변경 불가(immutable)
point = (3, 5)
colors = ("빨강", "초록", "파랑")
single = (42,) # 원소 1개 튜플 → 반드시 쉼표 필요!
empty = ()
# 인덱싱·슬라이싱은 리스트와 동일
print(colors[0]) # → 빨강
print(colors[-1]) # → 파랑
print(colors[1:]) # → ('초록', '파랑')
# 수정 불가!
# colors[0] = "노랑" # TypeError: tuple object does not support item assignment
# 튜플 메서드 (2가지만 지원)
print(colors.index("초록")) # → 1
print(colors.count("빨강")) # → 1
# 튜플 언패킹 (unpacking)
x, y = point
print(f"x={x}, y={y}") # → x=3, y=5
a, b, c = colors
print(a, b, c) # → 빨강 초록 파랑
# 함수 반환값으로 자주 사용
def min_max(numbers):
return min(numbers), max(numbers)
lo, hi = min_max([3, 1, 4, 1, 5, 9, 2])
print(f"최솟값: {lo}, 최댓값: {hi}") # → 최솟값: 1, 최댓값: 9
5. 리스트 vs 튜플
| 구분 | 리스트 [] | 튜플 () |
|---|---|---|
| 변경 가능 | ✅ 가능 (mutable) | ❌ 불가 (immutable) |
| 속도 | 상대적으로 느림 | 빠름 |
| 메모리 | 더 많이 사용 | 적게 사용 |
| 사용 시기 | 추가·삭제·수정이 필요한 데이터 | 변하지 않아야 하는 데이터 |
| 예시 | 장바구니, 검색 결과, 학생 목록 | 좌표(x,y), RGB 색상, 날짜(y,m,d) |
7강 핵심 요약
- 리스트: [] 대괄호, 변경 가능 — append/remove/sort 등 다양한 메서드
- 인덱스는 0부터, 음수 인덱스는 뒤에서부터 (-1이 마지막)
- 슬라이싱 [시작:끝:간격] — 끝 인덱스는 포함되지 않음
- 리스트 컴프리헨션: [표현식 for 변수 in 범위 if 조건] — 파이썬다운 코드
- 튜플: () 소괄호, 변경 불가 — 좌표·RGB 등 고정 데이터에 사용
- 다음 강: 딕셔너리와 집합 — 키-값으로 데이터 저장하기
관련 검색어 · 파이썬리스트, 리스트메서드, 파이썬슬라이싱, 리스트컴프리헨션, 파이썬튜플, append pop sort, 파이썬자료구조