# ex) 샌드위치 가게에서 고객들이 가장 좋아하는 빵을 찾아 메뉴를 결정하고 싶다.
# 각사람이 얼마나 투표했는지 저장한 딕셔너리를 정의
counters = {
'품퍼니켈': 2,
'사워도우': 1,
}
# if문을 사용한 예시
key = '밀'
print(key in counters)
if key in counters:
count = counters[key]
else:
count = 0
counters[key] = count + 1
print(counters[key])
print(counters)
False
1
{'품퍼니켈': 2, '사워도우': 1, '밀': 1}
#try를 사용한 예시
counters = {
'품퍼니켈': 2,
'사워도우': 1,
}
key = '밀'
print(key in counters)
try:
count = counters[key]
except KeyError:
count = 0
counters[key] = count + 1
print(counters[key])
print(counters)
False
1
{'품퍼니켈': 2, '사워도우': 1, '밀': 1}
# get인자를 통해 호출했을 때 없는 경우 0이라는 값을 호출
count = counters.get(key, 0) #두번째 인자가 없을때 어떤값을 호출할지 설정함.
counters[key] = count + 1
print(counters[key])
print(counters)
2
{'품퍼니켈': 2, '사워도우': 1, '밀': 2}
# in과 error를 사용했을 경우 더 짧지만 가독성은 떨어진다.
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
print(counters[key])
print(counters)
5
{'품퍼니켈': 2, '사워도우': 1, '밀': 5}
결과적으로 get함수를 사용하는 것이 가장 코드가 짧고 깔끔하다.
딕셔너리에 저장된 값이 리스트인 경우
votes = {
'바게트': ['철수', '순이'],
'치아바타': ['하니', '유리'],
}
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리']}
key = '브리오슈'
who = '단이'
if key in votes:
names = votes[key]
else:
votes[key] = names=[] #name을 리스트로 저장[] 처음에 폴더를 생성할 필요없이 한줄로 사용가능
names.append(who)
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], '브리오슈': ['단이']}
# keyerror예외가 발생한다는 사실에 의존한 함수
# in 보다는 효율적이다.
try:
names = votes[key]
except KeyError:
votes[key] = names = []
names.append(who)
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], '브리오슈': ['단이', '단이']}
#get함수를 사용하면 보다 간단해진다.
names = votes.get(key)
if names is None:
votes[key] = names = []
names.append(who)
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], '브리오슈': ['단이', '단이', '단이']}
# betterway10에서 배운 월러스를 이용하면 더 간단해진다.
if (names := votes.get(key)) is None:
votes[key] = names = []
names.append(who)
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], '브리오슈': ['단이', '단이', '단이', '단이']}
votes.get('바게트',0)
['철수', '순이']
dict은 setdefault메서드를 제공
names = votes.setdefault(key, [])
names.append(who)
print(votes)
{'바게트': ['철수', '순이'], '치아바타': ['하니', '유리'], '브리오슈': ['단이', '단이', '단이', '단이', '단이', '단이']}
setdefault는 get보다 효율적이지만 가독성이 좋지 못하다.
# setdefault의 함정 예시
# 따로 키를 설정하지 않아도 빈 값에 대입이 된다.
data = {}
key = 'foo'
value = []
data.setdefault(key, value)
print('이전:', data)
value.append('hello')
print('이후: ', data)
이전: {'foo': []}
이후: {'foo': ['hello']}
최초 예제에 setdefault를 사용하지 않은 이유