📌딕셔너리
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인 키와 값을 맨 앞으로 이동
'객체 지향 프로그래밍 > Python' 카테고리의 다른 글
enumerate함수(feat. 문자열비교) (0) | 2021.03.18 |
---|---|
코딩테스트에서 사용할만한 정렬기법 (0) | 2021.03.17 |
패킹과 언패킹 이해하기 (0) | 2021.03.16 |
map과 filter 함수 활용하기 (0) | 2021.03.15 |
파이썬에서는 모든 것이 객체! (2) | 2021.03.14 |