2. 딕셔너리(Dict)의 활용 및 주요 메서드
파이썬의 딕셔너리는 항목을 마음대로 추가하고 삭제할 수 있는 변경 가능(Mutable)한 자료형입니다.
리스트가 append 등의 메서드를 통해 원소를 조작하듯, 딕셔너리 역시 내부에 들어있는 Key와 Value 데이터들을 조작하고 안전하게 조회하기 위한 전용 메서드들을 폭넓게 제공합니다.
2.1 딕셔너리 병합 및 데이터 삭제 (update, pop, clear)
딕셔너리에 또 다른 딕셔너리의 데이터를 한꺼번에 들이부어 병합하거나, 내부의 특정 항목을 뽑아낼 때 주로 사용됩니다.
병합 (update)
기존 딕셔너리에 다른 딕셔너리를 덮어씌웁니다. 기존에 없던 키는 새롭게 추가되며, 기존에 중복된 키가 있다면 새 딕셔너리의 값으로 완벽히 덮어씌워져(갱신) 버립니다. (리스트처럼 + 연산자로 딕셔너리를 더할 수는 없습니다)
target_dict = {'a': 1, 'b': 2}
new_dict = {'b': 99, 'c': 3} # 'b'는 겹치고, 'c'는 새로운 키
target_dict.update(new_dict)
print(target_dict)
# {'a': 1, 'b': 99, 'c': 3} ('b' 값이 갱신되었음)
항목 삭제 (pop / popitem / clear)
pop(키): 전달한 키에 해당하는 (Key-Value) 쌍을 딕셔너리에서 영구히 삭제하며, 동시에 지워진 값을 반환합니다.popitem(): 딕셔너리의 ‘맨 마지막’에 들어왔던 항목을 무작위로 삭제하면서,(키, 값)형태의 튜플로 반환합니다.clear(): 안의 모든 값들을 휴지통에 버리고 완벽한 빈 딕셔너리{}로 만듭니다.
2.2 딕셔너리 내부 들여다보기용 View 메서드
딕셔너리에서 Key들만 따로 필요하거나, 혹은 순수 데이터(Value)만 모아서 작업해야 할 때 파이썬은 뷰(View)라고 불리는 특별한 객체를 반환합니다.
이 View들은 딕셔너리의 실시간 상태를 그대로 거울처럼 비치는 ‘반복형(Iterable)’ 객체이므로 for문에서 즉시 사용할 수 있습니다.
keys(): 딕셔너리 내부의 모든 ‘Key’들만 모아 보여줍니다.values(): 딕셔너리 내부의 모든 ‘Value’들만 모아 보여줍니다.items(): 딕셔너리 내부의 모든 ‘Key와 Value’를 쌍(Tuple형태)으로 묶어 보여줍니다.
user_info = {'name': 'Alice', 'role': 'Admin'}
print(user_info.keys()) # dict_keys(['name', 'role'])
print(user_info.values()) # dict_values(['Alice', 'Admin'])
print(user_info.items()) # dict_items([('name', 'Alice'), ('role', 'Admin')])
# 데이터 활용: 반복문에 items() 적극 활용하기
for key, val in user_info.items():
print(f"[{key}]의 값은 -> {val}")
[!TIP] 반환된 View 자체는 리스트가 아닙니다. 인덱스 번호(
[0])로 접근하려면list(user_info.keys())처럼 강제로 형 변환을 거쳐야 합니다.
2.3 안전하게 값 꺼내오기 (get, setdefault)
일반적으로 딕셔너리의 값을 읽을 땐 대괄호 [] 사이에 찾고자 하는 Key를 명시합니다. (ex: user_info['age']) 하지만 딕셔너리 내부에 해당하는 Key가 존재하지 않으면, 파이썬은 그 즉시 시스템 다운과 함께 KeyError 예외를 내뿜고 죽어버립니다.
이러한 치명적인 에러를 막기 위해 파이썬은 철저한 ‘방어 코드’를 위한 메서드 2가지를 제공합니다.
안전한 조회전용 방패: get
해당 Key가 존재하면 값을 돌려주지만, 해당 Key가 없더라도 절대 뻗지 않고 None을 돌려줍니다. 직접 기본 예비값을 지정해줄 수도 있습니다. (원본 딕셔너리는 변화가 없습니다)
score_dict = {'math': 80}
# 1. 뻗는 코드 (KeyError 발생)
# error_score = score_dict['english']
# 2. 안전한 조회 (에러 없이 None 반환)
safe_score = score_dict.get('english')
# 3. 값이 없을 때 반환할 기본값 세팅
default_score = score_dict.get('english', 0) # "영어가 없으면 0점을 주어라"
print(default_score) # 0
조회와 동시에 삽입까지 처리: setdefault
get이 단순 조회용 방패라면, setdefault는 “없어? 그럼 이참에 그냥 내가 빈 자리를 새로 파줄게!” 하는 능동적인 속성을 가집니다. 찾는 키가 없을 때 새롭게 항목을 생성해 끼워넣기까지 수행합니다.
cart = {'apple': 3}
# 'banana' 키가 없다면, 즉시 만들어버리고 1을 할당합니다.
result = cart.setdefault('banana', 1)
print(result) # 1
print(cart) # {'apple': 3, 'banana': 1} (원본 딕셔너리 자체에 바나나가 추가됨!)