어제 오늘 내일

[Python 실전] "KeyError는 이제 안녕!" 딕셔너리 안전 삭제 및 병합 가이드 본문

IT/Python

[Python 실전] "KeyError는 이제 안녕!" 딕셔너리 안전 삭제 및 병합 가이드

hi.anna 2026. 6. 4. 11:30

1. 안전하게 삭제하기:  보다는

대부분 del dic["key"]를 먼저 배우지만, 이 방식은 키가 없으면 즉시 에러를 발생시킵니다. 실무에서는 .pop()을 사용하여 기본값을 설정하는 방식을 훨씬 선호합니다.

📌 팁 1: 의 기본값(Default) 활용

키가 없어도 에러를 내지 않고 None이나 지정한 메시지를 반환하게 할 수 있습니다.

user = {"name": "제미니", "level": 10}

# 키가 없어도 에러 없이 안전하게 삭제 시도
# pop(키, 키가 없을 때 반환할 값)
removed_value = user.pop("email", "해당 키가 없습니다")

print(removed_value)  # 해당 키가 없습니다.
print(user)           # 원본은 그대로 유지됨

📌 팁 2: 조건문을 활용한 삭제

여러 개의 키를 삭제해야 한다면 딕셔너리 컴프리헨션으로 '삭제할 것만 빼고' 새로 만드는 것이 더 안전하고 깔끔합니다.

data = {"a": 1, "b": 2, "c": 3, "d": 4}
remove_keys = {"b", "d"}

# b와 d를 제외한 나머지만 모아서 새 딕셔너리 생성
clean_data = {k: v for k, v in data.items() if k not in remove_keys}

2. 스마트하게 병합하기: 와  연산자

여러 곳에서 수집된 데이터를 하나로 합칠 때, 단순히 덮어쓰는 것이 아니라 효율적으로 병합하는 방법입니다.

📌 팁 3: 파이썬 3.9+ '병합 연산자' 사용하기

최신 파이썬 버전에서는 | 기호 하나로 딕셔너리를 합칠 수 있습니다. 가독성이 매우 좋아집니다.

dict_a = {"apple": 1, "banana": 2}
dict_b = {"banana": 3, "cherry": 4}

# 병합 (뒤에 오는 dict_b의 값이 우선순위를 가집니다)
merged = dict_a | dict_b

print(merged) 
# {'apple': 1, 'banana': 3, 'cherry': 4}

📌 팁 4: 원본을 유지하며 합치기 vs 수정하기

  • .update(): dict_a 자체를 수정하여 합칩니다.
  • `{dict_a, dict_b}`: 두 딕셔너리를 해체해서 새로운 딕셔너리를 만듭니다. (구버전 파이썬에서도 작동하는 팁)

3. 중복 키가 걱정될 때:

병합할 때 같은 키가 있으면 값이 덮어씌워지는 게 일반적입니다. 하지만 "기존 값을 유지하면서 새로운 값을 추가"하고 싶다면(예: 한 사람의 여러 취미를 모으는 경우), defaultdict가 정답입니다.

from collections import defaultdict

# 리스트를 기본값으로 가지는 딕셔너리 생성
hobby_map = defaultdict(list)

# 데이터 합치기 시도 (Key 존재 여부를 확인할 필요가 없음!)
data = [("철수", "축구"), ("영희", "독서"), ("철수", "농구")]

for name, hobby in data:
    hobby_map[name].append(hobby)

print(dict(hobby_map))
# {'철수': ['축구', '농구'], '영희': ['독서']}

📝 핵심 요약

  1. 삭제할 때: 키 존재 여부가 불확실하다면 dic.pop("key", None)을 써라.
  2. 병합할 때: 최신 파이썬이라면 dict_a | dict_b가 가장 깔끔하다.
  3. 데이터를 누적할 때: defaultdict(list)를 쓰면 KeyError 없이 데이터를 쌓을 수 있다.

 

반응형
Comments