🎯 1. 리스트 vs 튜플 - 언제 무엇을 쓸까? ⭐

핵심 차이점

# 리스트: 변경 가능 (mutable)
arr = [1, 2, 3]
arr[0] = 10             # ✅ 가능
arr.append(4)           # ✅ 가능

# 튜플: 변경 불가능 (immutable)
tup = (1, 2, 3)
# tup[0] = 10           # ❌ TypeError!
# tup.append(4)         # ❌ AttributeError!

# 하지만 재할당은 가능
tup = (10, 20, 30)      # ✅ 새로운 튜플 생성

성능 비교

import sys

arr = [1, 2, 3, 4, 5]
tup = (1, 2, 3, 4, 5)

# 메모리 사용량
sys.getsizeof(arr)      # 104 bytes
sys.getsizeof(tup)      # 80 bytes  # 튜플이 더 작음!

# 생성 속도
import timeit

# 리스트 생성
timeit.timeit('[1, 2, 3, 4, 5]', number=1000000)
# 약 0.06초

# 튜플 생성
timeit.timeit('(1, 2, 3, 4, 5)', number=1000000)
# 약 0.02초  # 튜플이 더 빠름!

언제 무엇을 쓸까?

리스트를 사용:

튜플을 사용:

# 좌표는 변하지 않으므로 튜플
point = (3, 5)
points = [(1, 2), (3, 4), (5, 6)]

# 딕셔너리 키로 튜플 사용
d = {(0, 0): 'origin', (1, 1): 'diagonal'}

# 함수에서 여러 값 반환
def get_stats(arr):
    return (min(arr), max(arr), sum(arr)) # 튜플로 반환

min_val, max_val, total = get_stats([1, 2, 3, 4, 5])

🎯 2. 리스트 컴프리헨션 심화 ⭐

기본 패턴 복습

# [표현식 for 변수 in 반복가능객체 if 조건]

# 제곱수
squares = [x**2 for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 짝수만
evens = [x for x in range(1, 11) if x % 2 == 0]
# [2, 4, 6, 8, 10]

# 짝수만 제곱
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
# [4, 16, 36, 64, 100]

조건부 표현식 (if-else) ⭐

# [참일때값 if 조건 else 거짓일때값 for 변수 in 반복가능객체]

# 짝수는 그대로, 홀수는 0
result = [x if x % 2 == 0 else 0 for x in range(1, 11)]
# [0, 2, 0, 4, 0, 6, 0, 8, 0, 10]

# 양수는 그대로, 음수는 절댓값
arr = [-3, -1, 2, -4, 5]
result = [x if x >= 0 else -x for x in arr]
# [3, 1, 2, 4, 5]

# 3의 배수는 'Fizz', 5의 배수는 'Buzz', 둘 다면 'FizzBuzz', 아니면 숫자
result = [
    'FizzBuzz' if x % 15 == 0
    else 'Fizz' if x % 3 == 0
    else 'Buzz' if x % 5 == 0
    else x
    for x in range(1, 16)
]

중첩 리스트 컴프리헨션 ⭐

# 2차원 배열 생성
matrix = [[i*j for j in range(1, 4)] for i in range(1, 4)]
# [[1, 2, 3],
#  [2, 4, 6],
#  [3, 6, 9]]

# 1차원으로 펼치기 (flatten)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 설명: for문 순서대로 읽기
# for row in matrix:
#     for num in row:
#         flat.append(num)

# 조건 추가: 짝수만
flat_even = [num for row in matrix for num in row if num % 2 == 0]
# [2, 4, 6, 8]

중첩 조건과 중첩 반복

# 2차원 배열에서 조건부 필터링
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 각 행에서 짝수만
result = [[num for num in row if num % 2 == 0] for row in matrix]
# [[2], [4, 6], [8]]

# 홀수 행의 짝수만
result = [
    [num for num in row if num % 2 == 0]
    for i, row in enumerate(matrix)
    if i % 2 == 1
]
# [[4, 6]]

# 곱셈표 (특정 조건)
result = [
    [i*j for j in range(1, 10) if (i*j) % 2 == 0]
    for i in range(1, 10)
]

딕셔너리/셋 컴프리헨션