image.png


List

순서 존재, 중복 허용, 가변

lst = [1, 2, 3, 4, 5]

# 인덱싱
lst[0]      # 1 (첫번째)
lst[-1]     # 5 (마지막) - 자바엔 없는 음수 인덱스
lst[-2]     # 4

# 슬라이싱 [start:end:step] - end는 미포함
lst[1:3]    # [2, 3]
lst[:3]     # [1, 2, 3]
lst[2:]     # [3, 4, 5]
lst[::2]    # [1, 3, 5] (2칸씩)
lst[::-1]   # [5, 4, 3, 2, 1] (역순 - 자주 씀)

# 추가/삭제
lst.append(6)        # 끝에 추가
lst.insert(0, 0)     # 인덱스 0에 삽입
lst.extend([7, 8])   # 리스트 병합 (addAll)
lst.remove(3)        # 값 3 제거 (첫 매칭)
lst.pop()            # 마지막 제거 + 반환
lst.pop(0)           # 인덱스 0 제거 + 반환
del lst[0]           # 인덱스로 삭제

# 정렬
lst.sort()                      # 원본 정렬 (in-place)
lst.sort(reverse=True)          # 내림차순
lst.sort(key=lambda x: -x)      # 커스텀 정렬 (Comparator)
sorted(lst)                     # 새 리스트 반환 (원본 유지)

# 기타
len(lst)         # 크기
3 in lst         # 포함 여부 (contains) - O(n)
lst.count(2)     # 2의 개수
lst.index(4)     # 4의 인덱스

Tuple (불변 List)

기본 사용:

tpl = (1, 2, 3)
tpl[0]             # 1 (읽기는 됨)
tpl[0] = 9         # Error -> 수정은 불가능

# 언팩킹 - 파이썬 특유, 자주 사용
a, b, c = tpl      # a=1, b=2, c=3
x, y = y,x         # swap

# 함수가 여러 값 변환할 때 실제론 tuple
def minmax(lst):
		return min(lst), max(lst)  # (3, 5) tuple로 반환
lo, hi = minmax([3, 1, 5])     

불변성(immutable):

값이 바뀌면 안 되는 데이터를 보호할 수 있어, 좌표 (x, y) , RGB 값 같이 “한 묶음으로 고정된: 데이터에 적합

dict 키 / set 원소로 사용:

불변이라 hashable한데, 그 이유는 내용 기반으로 딕셔너리 키나 셋에 넣을 수 있음, 리스트는 불가능

여기서 hashable이란?

정의로는 “해시값을 구할 수 있다”라는 의미

hash() 함수에 넣었을 때 정수값이 나오는 객체를 hashable하다고 함

hash((1, 2))  # 정수 나옴 -> OK
hash([1, 2])  # TypeError: unhashable type: 'list'

이게 중요한 이유는 dict와 set은 내부적으로 해시테이블로 동작

키를 해시값으로 변환해서 그 위치에 저장하는 구조라서, 키로 쓸 값은 반드시 해시값을 구할 수 있어야 함

이러한 점이 불변성과 연결이 되는 지점인데

핵심은 해시값은 객체가 사는 동안 변하면 안된다는 것

이로 인해서 dict / set에 Key를 Tuple이 사용이 가능한 이유:

# 좌표를 키로 쓰고 싶을 때
visited = set()
visited.add((3, 5)) # OK
visited.add([3, 5]) # TypeError

성능적 이점:

리스트보다 메모리를 적게 쓰고 생성도 약간 빠름

크기가 고정이라 내부 구조 단순

의도 표현:

“이건 변경되지 않는 고정 묶음”이라는 걸 코드 읽는 사람에게 알려줌

함수 다중 반환값이 대표적

def get_user(): return name, age

name, age = get_user()

Set (자바 HashSet)

중복 불가, 순서 없음, 집합 연산 강력

st = {1, 2, 3, 3}    # {1, 2, 3} - 중복 자동 제거
empty = set()        # 빈 set (**{}는 dict임!** 주의)

st.add(4)
st.remove(2)         # 없으면 에러
st.discard(99)       # 없어도 에러 안 남

# 집합 연산 (자바보다 훨씬 직관적)
a = {1, 2, 3}
b = {2, 3, 4}
a | b    # 합집합 {1, 2, 3, 4}
a & b    # 교집합 {2, 3}
a - b    # 차집합 {1}
a ^ b    # 대칭차 {1, 4}

# 활용: list 중복 제거
unique = list(set([1, 1, 2, 2, 3]))

dict (자바 HashMap)

key-value, Python 3.7+ 부터 삽입 순서 유지

d = {"a": 1, "b": 2}

# 접근
d["a"]              # 1
# d["z"]            # 없으면 KeyError!
d.get("z")          # None (안전)
d.get("z", 0)       # 기본값 0 반환

# 추가/수정
d["c"] = 3
d.update({"d": 4, "e": 5})

# 삭제
del d["a"]
d.pop("b")          # 제거 + 값 반환

# 순회 (중요)
for k in d:                    # key만
    print(k)
for k, v in d.items():         # key, value (entrySet)
    print(k, v)
for v in d.values():           # value만
    print(v)

# 존재 확인
"a" in d            # key 존재 여부