[Python] 10. dict의 생성과 zip / dict의 루핑 기술과 컴프리헨션
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
10-1. dict 생성 방법
d1 = {'a': 1, 'b': 2, 'c':3}
d2 = dict([('a', 1), ('b', 2), ('c', 3)])
d3 = dict(a=1, b=2, c=3) # 키가 문자열일 때!
d4 = dict(zip(['a', 'b', 'c'], [1, 2, 3])) # 키와 값 별도로 묶어서 생성함
d1
d2
d3
d4
(결과) {'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3}
원래 딕셔너리 같은 저장소는 저장 순서가 따로 없다. 하지만 파이썬 3.7부터는 저장 순서를 보장한다고 한다.
d = {'a':1, 'b':2, 'c':3}
d['d'] = 4
d
for a in d:
print(d[a], end=', ')
(결과) {'a': 1, 'b': 2, 'c': 3}
1, 2, 3, 4
10-2. zip 함수
zip 함수는 인자로 리스트, 튜플, 또는 문자열을 받는다. 이들의 위치에 있는 값들 끼리 조합해서 다수의 튜플을 만들어 내는게 zip 함수의 역할이다. zip 함수가 적용되면 iterable 객체가 반환된다. 따라서 zip이 반환하는 객체는 for 루프에 들어갈 수 있다!
z1 = zip(['a', 'b', 'c'], [1, 2, 3])
z2 = zip(('a', 'b', 'c'), (1, 2, 3))
z3 = zip('abc', (1, 2, 3))
for a in z1:
print(a, end = ', ')
for b in z2:
print(b, end = ', ')
for c in z3:
print(c, end = ', ')
(결과) ('a', 1), ('b', 2), ('c', 3),
('a', 1), ('b', 2), ('c', 3),
('a', 1), ('b', 2), ('c', 3),
zip 함수가 적용된 녀석을 list에 담을 수도 있고, 튜플이나 dict에 담을 수도 있다.
z = zip(('a', 'b', 'c'), (1, 2, 3)) # 3개 이상을 조합해서 zip 함수 적용도 가능하다!
l = list(z)
z = zip(('a', 'b', 'c'), (1, 2, 3)) # iterable 객체가 이미 사용되어 다시 z를 만들지 않으면 빈값이 된다.
t = tuple(z)
z = zip(('a', 'b', 'c'), (1, 2, 3))
d = dict(z)
l
t
d
(결과) [('a', 1), ('b', 2), ('c', 3)]
(('a', 1), ('b', 2), ('c', 3))
{'a': 1, 'b': 2, 'c': 3}
10-3. 딕셔너리 루핑 기술
딕셔너리의 다음 세가지 메소드를 알아두자!
dict.keys(): 딕셔너리의 키들만 참조
dict.values(): 딕셔너리의 값들만 참조
dict.items(): 딕셔너리 키와 값을 튜플 형태로 참조
d = dict(a=1, b=2, c=3)
for k in d.keys():
print(k, end = ', ')
for v in d.values():
print(v, end = ', ')
for kv in d.items():
print(kv, end = ', ')
for k, v in d.items():
print(k, v, sep = ', ')
(결과) a, b, c,
1, 2, 3,
('a', 1), ('b', 2), ('c', 3),
a, 1
b, 2
c, 3
이들은 모두 ‘뷰 객체’를 반환한다.
10-4. 뷰 객체
뷰 객체는 딕셔너리의 현재 상태를 그대로 반영한다는 특징을 갖는다. 무슨 뜻인지 다음 예제를 보면 바로 이해가 될 것이다.
d = {'a' : 1, 'b' : 2, 'c' : 3}
vu = d.items()
for kv in vu:
print(kv, end=', ')
d['a'] += 10
d['c'] -= 2
for kv in vu:
print(kv, end=', ')
(결과) ('a', 1), ('b', 2), ('c', 3),
('a', 11), ('b', 2), ('c', 1),
10-5. dict 컴프리헨션
d1 = dict([('a', 1), ('b', 2), ('c', 3)])
d2 = {k: v*2 for k, v in d1.items()}
d3 = {k: v*2 for k, v in d2.items()}
d1
d2
d3
(결과) {'a': 1, 'b': 2, 'c': 3}
{'a': 2, 'b': 4, 'c': 6}
{'a': 4, 'b': 8, 'c': 12}
앞서 배웠던 리스트 컴프리헨션과 거의 비슷하다.
dict 컴프리헨션에 zip 함수를 적용할 수 도 있고, if문도 적용할 수 있다.
ks = ['a', 'b', 'c', 'd']
vs = [1, 2, 3, 4]
d = {k: v for k, v in zip(ks, vs) if v % 2}
d
(결과) {'a': 1, 'c': 3}
Leave a comment