객체 지향 프로그래밍/Python

딕셔너리와 zip함수 이해하기

ghtis1798 2021. 3. 19. 11:26

📌딕셔너리

dict()함수 혹은 중괄호('{}')를 이용해 딕셔너리를 생성할 수 있다.

딕셔너리란 key와 value로 이루어진 자료형이다.

dict1 = dict(a=1, b=2, c=3)
dict2 = dict([('a',1),('b',2),('c',3)])
dict3 = {'a':1, 'b':2, 'c':3}
print(dict1)
print(dict2)
print(dict3)
# {'a':1, 'b':2, 'c':3}

📌zip()

zip()함수를 이용해서도 딕셔너리를 만들 수 있다.

dict1 = dict(zip(['a','b','c'], [1,2,3]))
print(dict1)

zip의 1,2번째 모두 길이가 같은 Iterable한 객체를 받는다.

그리고 각각의 요소를 차례로 짝지어주는 역할을 한다.

c = list(zip('abc', (1,2,3), ['one','two','three']))
print(c)

📌딕셔너리 활용

d = dict(a=1, b=2, c=3)
# ver1 : key 반환
for k in d:
    print(d[k], end=', ')
# ver2
for k in d.keys():
    print(d[k], end=', ')
# ver3
for v in d.values():
    print(v, end=', ')
# ver4 : (key, value) 반환
for kv in d.items():
    print(kv, end=', ')
# ('a', 1), ('b', 2), ('c', 3),

📌딕셔너리 값 변경

딕셔너리에 값을 변경할 때 두 가지 경우가 있다.

딕셔너리의 key값이 존재하는 경우

이 경우 value 값을 더하거나 빼면 변경된 값이 저장된다.

value 값을 더하거나 빼면 변경된 값이 저장되기 때문이다.

d = {'red':1, 'white':2, 'blue':3}
d['red'] += 1
print(d['red']) # 2 출력

딕셔너리의 key값이 존재하지 않는 경우

key 값이 존재하지 않는데 값을 변경할 경우 에러가 발생한다.

따라서 딕셔너리 값 변경 시 다음과 같은 예외 처리가 필요하다.

string = 'apple'
d = {}
for x in string:
    # d[x]가 아니었다. 기본이 key값 기준이기 때문인듯하다.
  # d.keys()로 바꾸어도 정상동작한다.
    if x in d.keys():   # x가 d.keys() 안에 있으면
        d[x] += 1
    else:
        d[x] = 1
print(d) # {'a': 1, 'p': 2, 'l': 1, 'e': 1}

setdefault

setdefault는 딕셔너리에 존재하는 함수이다.

키 값이 존재하지 않을 때 어떤 값을 반환할 지를 결정해준다.

string = 'apple'
d = {}
for k in d.keys():
    d[k] = d.setdefault(k,0) + 1 # 딕셔너리의 setfefault로 if문 대체

d.setdefault(k,0)에서 k는 키, 0은 디폴트 값이다.

만약 k에 해당하는 키가 없다면 0을 반환하고 있다면 해당 value값을 반환한다.

defaultdict

defaultdict는 딕셔너리 생성 시 부터 디폴트 값을 갖는다.

from collections import defaultdict
s = 'apple'
d = defaultdict(int)
for k in s:
    d[k] += 1

print(d)

d = defaultdict(int)는 int 함수를 등록하면서 defaultdict를 호출한다.

만약 값이 없다면 int()의 디폴트값인 0이 등록된다.

📌컴프리헨션

d1 = dict(a=1, b=2,c=3)
d2 = {k : v*2 for k,v in d1.items()} # d1의 값을 두 배 늘린 딕셔너리
d3 = {k : v*2 for k,v in d2.items()} # d2의 값을 두 배 늘린 딕셔너리
d4 = {k : v for k,v in d3.items() if v%2} # d3에서 value가 홀수인 것만 모음

print(d1)
print(d2)
print(d3)
print(d4

📌OrderedDict

뜻 그대로 딕셔너리의 순서를 지정할 수 있는 딕셔너리이다.

일반 딕셔너리 역시 입력한 순서에 따라 저장이 된다.

그럼에도 OrderedDict가 필요한 경우가 있다.

그건 딕셔너리의 순서를 비교해야 하거나, 순서를 바꾸어야 하는 경우이다.

일반 딕셔너리는 비교 시 순서가 달라도 key,value만 같으면 같다고 판단한다.

d1 = dict(zip(['a','b','c'], [1,2,3]))
d2 = dict(zip(['c','b','a'], [3,2,1]))

print(d1 == d2) # True

from collections import OrderedDict
d1 = OrderedDict(a=1, b=2, c=3)
d2 = OrderedDict(c=3, b=2, a=1)

print(d1 == d2) # False

값 이동시키기

from collections import OrderedDict
d1 = OrderedDict(a=1,b=2,c=3)
for kv in d1.items():
        print(kv, end=' ') # ('a', 1) ('b', 2) ('c', 3)

d1.move_to_end('b') # 키 값이 b인 키와 값을 맨 뒤로 이동
d1.move_to_end('b', last=False) # 키 값이 b인 키와 값을 맨 앞으로 이동