[Python] dict의 생성과 zip, dict의 루핑 기술과 컴프리헨션

2 분 소요

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 # 내용비교. 만드는 방법 달라도 똑같은 결과물
True
>>> type({})
<class 'dict'>

딕셔너리는 dict이라는 클래스의 객체이다. 딕셔너리 저장소는 저장 순서를 보장하지 않는다. 하지만 파이썬 3.7부터 파이썬은 저장 순서를 보장하고 있다.

>>> d = {'a':1, 'b':2, 'c':3}
>>> d['d'] = 4 # 추가된 값은 맨 뒤에 저장된다.
>>> d
 {'a':1, 'b':2, 'c':3, 'd':4}
 >>> for k in d:
        print(d[k], end = ', ')

1, 2, 3, 4,



zip 함수

>>> z = zip(['a','b','c'], [1,2,3])
>>> for i in z:
        print(i, end=', ')

('a', 1), ('b', 2), ('c', 3),

두 개의 리스트에 저장된 값들을 조합

>>> z = zip(('a','b','c'), (1,2,3))
>>> for i in z:
        print(i, end=', ')

('a', 1), ('b', 2), ('c', 3),

두 개의 튜플에 저장된 값들을 조합

>>> z = zip('abc', (1,2,3))
>>> for i in z:
        print(i, end=', ')

('a', 1), ('b', 2), ('c', 3),

문자열과 튜플에 저장된 값들을 조합

위 코드에서 볼수 있듯이 zip이 반환하는 객체는 for루프에 둘 수 있다. 즉 이는 iterable 객체이다. 그리고 zip은 인자로 전달된 리스트 또는 튜플 또는 문자열을 조합해 다수의 튜플을 만들어 내는데, 같은 위치에 있는 값들끼리 조합해서 튜플을 만든다.

>>> z = zip('abc', (1,2,3), [4,5,6])
>>> for i in z:
        print(i, end=', ')

('a', 1, 4), ('b', 2, 5), ('c', 3, 6),

셋 이상의 값들을 조합해 내는 것도 가능하다.

>>> z = list(zip((1,2,3), [4,5,6]))
>>> z = tuple(zip((1,2,3), [4,5,6]))
>>> z = dict(zip((1,2,3), [4,5,6]))

zip함수와 리스트, 튜플, dict함수와 조합하면 결과물을 각각 리스트, 튜플, 딕셔너리로 만들 수 있다.

dict의 루핑 테크닉

딕셔너리의 다음 세 메소드를 알아 두면 딕셔너리를 대상으로 보다 다양한 for 루프를 구성할 수 있다.

dict.keys() 딕셔너리의 키들만 참조하고자 할 때 dict.values() 딕셔너리의 값들만 참조하고자 할 때 dict.items() 딕셔너리의 키와 값을 튜플 형태로 참조하고자 할 때

위의 세 메소드가 반환하는 것을 ‘뷰(view)’객체라고 한다. 뷰 객체도 iterable 객체로 for 루프를 통해 그 값을 하나씩 참조할 수 있다.

>>> d = dict(a=1, b=2, c=3)
>>> for k in d.keys():  # keys는 뷰 객체 반환함.
        print(k, end=', ')

a, b, c,

>>> for k in d.values(): # values는 뷰 객체 반환함.
        print(k, end=', ')

1, 2, 3,

>>> for k in d.items(): # items는 뷰 객체 반환함.
        print(k, end=', ')

('a',1), ('b',2), ('c', 3),

>>> for k, v in d.items():      # 튜플 언패킹
        print(k, v, sep=', ')

a, 1
b, 2
c, 3

뷰가 바라보는 현재 상태

>>> d = dict(a=1, b=2, c=3)
>>> vo = d.items()  # 뷰 객체 얻음
>>> for kv in vo:
        print(kv, end=' ')

('a',1) ('b',2) ('c',3)
>>>
>>> d['a'] +=3
>>> d['c'] -=2
>>> for kv in vo: # 수정 사항이 뷰 객체에 그대로 반영됨.
        print(kv, end=' ')

('a',4) ('b',2) ('c',1)

뷰 객체는 단순히 키 또는 값을 얻어오는데 사용될 뿐만 아니라 현재 딕셔너리 상태를 그대로 반영한다는 특징이 있다.

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
{'a':1, 'b':2, 'c':3}
>>> d2
{'a':2, 'b':4, 'c':6}
>>> d3
{'a':4, 'b':8, 'c':12}
>>> d1 = dict(a=1, b=2, c=3)
>>> d2 = {k : v for k,v in d1.items() if v%2}
>>> d2
{'a':1, 'c':3}
>>> 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}