딕셔너리에서 키가 존재하지 않을 수 있는 상황을 처리하는 방법은 여러 가지가 있습니다. 각 방법의 장단점을 이해하고 상황에 맞는 최적의 방법을 선택하는 것이 중요합니다.
counters = {
'품퍼니켈': 2,
'사워도우': 1,
}
key = '밀' # 존재하지 않는 키
if key in counters:
count = counters[key]
else:
count = 0
counters[key] = count + 1
특징:
in
검사 + 실제 접근)try:
count = counters[key]
except KeyError:
count = 0
counters[key] = count + 1
특징:
count = counters.get(key, 0)
counters[key] = count + 1
장점:
if key not in counters:
counters[key] = 0
counters[key] += 1
if key in counters:
counters[key] += 1
else:
counters[key] = 1
try:
counters[key] += 1
except KeyError:
counters[key] = 1
분석:
votes = {
'바게트': ['철수', '순이'],
'치아바타': ['하니', '유리'],
}
key = '브리오슈' # 새로운 빵 종류
who = '단이'
if key in votes:
names = votes[key]
else:
votes[key] = names = []
names.append(who)
try:
names = votes[key]
except KeyError:
votes[key] = names = []
names.append(who)
names = votes.get(key)
if names is None:
votes[key] = names = []
names.append(who)
if (names := votes.get(key)) is None:
votes[key] = names = []
names.append(who)
names = votes.setdefault(key, [])
names.append(who)
setdefault()의 동작:
data = {}
key = 'foo'
value = []
data.setdefault(key, value)
print('이전:', data) # {'foo': []}
value.append('hello')
print('이후: ', data) # {'foo': ['hello']}
중요한 포인트:
setdefault()
는 기본값 객체를 직접 딕셔너리에 저장합니다count = counters.setdefault(key, 0)
counters[key] = count + 1
문제점:
setdefault()
로 가져온 후 다시 할당하는 것은 비효율적get()
방법이 더 적합합니다# ✅ 권장: get() 사용
count = counters.get(key, 0) + 1
counters[key] = count
# ✅ 권장: setdefault() 사용
names = votes.setdefault(key, [])
names.append(who)
# ✅ 권장: if/get() 조합
if key not in expensive_cache:
expensive_cache[key] = expensive_computation()
result = expensive_cache[key]
# 단어 빈도 계산
def count_words(text):
word_counts = {}
for word in text.split():
word_counts[word] = word_counts.get(word, 0) + 1
return word_counts
# 그룹별 분류
def group_by_category(items):
groups = {}
for item in items:
category = item.get_category()
groups.setdefault(category, []).append(item)
return groups
# 중첩 딕셔너리 처리
def nested_dict_access(data, key1, key2):
return data.get(key1, {}).get(key2, 'default_value')
딕셔너리 키 처리의 핵심 원칙:
- 단순한 값:
dict.get(key, default)
사용- 복잡한 객체:
dict.setdefault(key, default)
사용- KeyError 예외 처리보다는 명시적 기본값 처리를 선호
- 코드의 의도를 명확하게 드러내는 방법 선택
get()
과setdefault()
를 적절히 활용하면:
- 코드가 더 간결해집니다
- KeyError 예외를 방지할 수 있습니다
- 의도가 명확하게 드러납니다
- 성능도 향상됩니다
특히 데이터 집계, 그룹화, 캐싱 등의 작업에서 이러한 패턴들이 매우 유용합니다.