
순서 존재, 중복 허용, 가변
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의 인덱스
기본 사용:
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()
중복 불가, 순서 없음, 집합 연산 강력
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]))
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 존재 여부