이번에는 지능형 딕셔너리(Comprehending Dict)에 대하여 알아보겠습니다.
사실 dictionary는 list 만큼 comprehension이 유용하지 않습니다. 하지만 길이가 같은 리스트 2개를 각각 Key Value로 삼아 딕셔너리로 형변환 하고자 한다면 유용하게 사용할 수 있습니다
형식
a = {i : j for i, j in sub}
일반적인 for문을 돌면서 i, j값을 key와 value로 나누어 i:j형태로 출력하는 것이다.
예를들어
familly = [(mother,"홍영희"), (father,"김진짜"),(brother,"김길동"),(sister,"김소희")]
n_code1 = {familly : name for country, code in familly}
n_code2 = {familly.upper() : name for country, code in familly}
for문을 통해 familly요소를 하나씩 가져와 앞에 부분은 famill에, 뒤에 부분은 name에 저장되어 출력된다. 예를 들어 familly를 각각 (mother,"홍영희"), (father,"김진짜")(brother,"김길동"), (sister,"김소희")로 나누어 dict형태로 mother,father,brother,sister은 key, "홍영희","김진짜","김길동","김소희"는 value나뉘어 출력합니다.
source = (('k1','val1'),
('k1','val2'),
('k2','val3'),
('k2','val4'),
('k2','val5')
)
new_dict1 = {}
# no use setdefault
for k, v in source:
if k in new_dict1:
new_dict1[k].append(v)
else:
new_dict1[k] = [v]
print('ex 3-1 -',new_dict1)
source인 각 튜플을 key와 value로 구분하여 key가 new_dict에 있으면 요소를 key에 해당하는 리스트에 넣어주고, 없으면 new_dict1에 key와 해당하는 value를 리스트로 만들어준다.
이를 훨씬 간단하게 구현하는 방법이 있다. python dict에서는 dict setdefault를 제공하는데 이를 이용하면 위 코드를 간단하게 바꿀 수 있다.
for k,v in source:
new_dict2.setdefault(k,[]).append(v)
k값이 new_dict2에 있으면 v를 append를 하고 없으면 []를 통해 새로운 key를 생성하고 value부분에 v를 append한다.