<개인공부>/[Python]

[python] 파이썬 딕셔너리(dictionary) 자료형 정리 및 예제

BlockDMask 2020. 12. 13. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 파이썬의 키와 값으로 매칭이 되어서 유용하게 사용할 수 있는 딕셔너리(dictionary) 데이터 타입에 대해서 알아보려고 합니다.
딕셔너리는 매우 유용하게 쓰일 수 있는 자료형이므로 잘 알아 두시면 유용하게 쓸 수 있을것 입니다.
(C++에서 하시던 분들은 map container와 동일한 것이라 생각하면 쉬울 것 입니다.)

<목차>
1. 딕셔너리란?
2. 딕셔너리 관련 함수들 (in, keys, values, items, get, 
del, clear)
3. 딕셔너리 예제


1. 파이썬 딕셔너리란?


1-1) 딕셔너리 타입

딕셔너리는 키(key)와 값(value)이 한 쌍이 하나의 대응 관계를 가지고 있는 자료형 입니다.
예를 들면 "김씨" : "여자", "박씨" : "남자" 이런식으로 "김씨"라는 Key가 열쇠고 그 "김씨"의 값으로 "여자"라는 것이 쌍을 이루는 자료형 입니다.

예제가 좀 헷갈리네요. 다시 예제를 들어보겠습니다.
"바늘": "실"
"연필": "지우개"
"라면": "볶음밥"
"소풍": "김밥"

이런것처럼 한쌍씩 이쁘게 이루어져 있는걸 파이썬에서는 딕셔너리 데이터 타입이라 합니다.
빨간색으로 색칠한 앞라인 "바늘", "연필", "라면", "소풍"이 Key가 되고,
그 짝에 맞는 "실", "지우개", "볶음밥", "김밥" 같은것이 Value값이 됩니다.

리스트 데이터 타입은 값들을 쭈르르륵 이어서 다루기 쉽게 하기 위해서 만들어졌다면, 이 딕셔너리는 데이터를 특정 "키"와 "값"을 한 쌍을 이루게 해서 순서와 상관없이 "키"를 이용해서 바로 "값"에 접근이 가능하도록 만들어진 그런 데이터 타입니다.

위에서 이야기했듯
딕셔너리의 특징은 순서가 없고, 키와 값의 쌍으로 이루어져 있으며, 키와 값을 선언할때는 콜론(:) 으로 구분합니다. 모양을 한번 보면 이렇습니다.

딕셔너리 = { 키: 값 }

딕셔너리 = { Key1: Value1, Key555: Value555, Key9: Value9, Key22: Value22}

이런식으로 이루어져있으며 순서가 상관없다는걸 알려드리기 위해서 숫자를 임의로 넣어보았습니다. 이해가 좀 가시나요?


1-2) 주의해야할 점

- 키 값에 list, set이 올 수 없습니다.
키 값은 immutable (불변한) 객체 타입이 와야 합니다. 그렇기 때문에 mutable한 변할수 있는 객체 타입인 list나 set 같은 타입은 딕셔너리의 키가 될 수 없습니다.

- 키 값은 중복 될 수 없습니다.
동일한 키를 추가하면 나중에 추가된 키와 값에 기존의 키와 값이 덮어띄워집니다.
키 값은 고유해야하기 때문입니다. 그래야 정확히 그 데이터에 접근할 수 있기 때문입니다.


1-3) 딕셔너리 키값 추가, 접근 방법, 값 변경

딕셔너리[키] = 값 을 통해서 키,값 쌍을 추할 수 있습니다.

딕셔너리[키] 를 통해서 값에 접근할 수 있습니다.

딕셔너리[키] = 값 을 통해서 값을 변경할 수 있습니다.
(사실 이건 키 중복으로 덮어씌우는것)

그럼 딕셔너리를 만들고, 키값 쌍을 추가해보고, 딕셔너리 값에 접근해보고, 값을 변경하는것까지 한번 예제로 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1. 딕셔너리 생성
= {'a'123123}
 
# 2. 값 추가
d[999= 10                 # 숫자 키, 숫자 값
d['99'= 111               # 문자 키, 숫자 값
d['BlockDMask'= "blog"    # 문자 키, 문자 값
d['wow'= [12345]  # 문자 키, 리스트 값
d[(12)] = "this is value" # 튜플 키, 문자 값
d[1= (3'a'5)          # 숫자 키, 튜플 값
 
 
# 3. 값 접근
print("3. 딕셔너리 값 접근")
print(f'd["a"] = {d["a"]}')
print(f'd[999] = {d[999]}')
print(f'd[1] = {d[1]}')        # 숫자 키는 index와 헷갈릴 수 있음
print(f'd[(1,2)] = {d[(1,2)]}')
print(f'd["wow"] = {d["wow"]}')
print(f'd["BlockDMask"] = {d["BlockDMask"]}')
 
# 4. 값 변경
print()
print("4. 딕셔너리 값 변경")
print(f'before : d["BlockDMask"] = {d["BlockDMask"]}')
d["BlockDMask"= 'boy'
print(f'after  : d["BlockDMask"] = {d["BlockDMask"]}')
 
print(f'before : d["a"] = {d["a"]}')
d["a"= 'asdf1234'
print(f'after  : d["a"] = {d["a"]}')
 
cs

이렇게 딕셔너리를 생성해보고, 키값 쌍을 추가 해보고, 접근 및 값 변경까지 해보았습니다. 이제 아래에서 딕셔너리 관련 함수들에 대해서 알아보겠습니다.

여러 데이터 타입을 이용해서 추가해보았는데 도움이 되었나요?
대부분의 예제는 한번씩 쓱 보고 지나가면 좋을것 같고, 제가 3가지만 추가로 말씀드리고 싶은것은 아래와 같습니다.

- d[(1,2)] = "this is value" 처럼 튜플은 불변하는 타입이기 때문에 딕셔너리의 key가 될 수 있습니다.
- d["wow"] = [1,2,3,4,5] 처럼 리스트는 key는 될수 없지만 value가 될 수 있습니다.
- d[1] = (3, 'a', 5)처럼 key값이 숫자 타입인 경우는 리스트 index 접근과 헷갈릴 수 있지만, 인덱스 접근이 아니라는 것을 알아 두어야 합니다. 엄연히 딕셔너리에서 key 접근 입니다. 


2. 파이썬 딕셔너리 관련 함수들


2-1) in - 딕셔너리에 해당 키가 있는가?

in 을 통해 우리는 딕셔너리에 해당 키가 있는지 검사 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 딕셔너리 생성
= {'a'123123'b'"blog"'c'3333}
 
# b가 있는지 체크
if 'b' in d:
    print('b가 딕셔너리 안에 있습니다.')
else:
    print('b가 딕셔너리 안에 없습니다.')
 
# e가 있는지 체크
if 'e' in d:
    print('e가 딕셔너리 안에 있습니다.')
else:
    print('e가 딕셔너리 안에 없습니다.')
 
cs

이런식으로 딕셔너리의 key가 있는지 검사를 할 수 있습니다. 

value가 있는지 검사하기 위해서는
if 'blog' in d.values() 를 이용할 수 있습니다.


2-2) keys - 딕셔너리의 키 뽑기

딕셔너리.keys() 함수를 통해서 딕셔너리의 키(key)들을 한번에 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
# 딕셔너리
= {'a'123123'kim''blockdmask''b'"blog"'c'3333123'name'}
 
# key 출력
print(d.keys())
 
# key 하나씩 받기
for k in d.keys():
    print(f'key : {k}')
 
cs

딕셔너리.keys() 를 이용해서 키들을 가지고 올 수 있습니다.
for문을 이용해서 key를 하나씩 받아서 사용도 할 수 있습니다.


2-3) values - 딕셔너리의 값 뽑기

딕셔너리.values() 함수를 통해서 딕셔너리의 값(value)들을 한번에 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
# 딕셔너리
= {'a'123123'kim''blockdmask''b'"blog"'c'3333123'name'}
 
# values 출력
print(d.values())
 
# value 하나씩 받기
for v in d.values():
    print(f'value : {v}')
 
cs

딕셔너리.values() 를 이용해서 키들을 가지고 올 수 있습니다.
for문을 이용해서 value를 하나씩 받아서 입맛에 맞게 사용할 수 있습니다.


2-4) items - 딕셔너리 키, 값 합쳐서 전부 뽑기

딕셔너리.items() 함수를 통해서 딕셔너리의 키,값 쌍을 한번에 볼 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 딕셔너리
= {'a'123123'kim''blockdmask''b'"blog"'c'3333123'name'}
 
# items 출력
print(d.items())
 
# items 하나씩 출력
for m in d.items():
    print(f'한쌍씩 : {m}')
    print(f'Key : {m[0]}')
    print(f'Value : {m[1]}')
    print()
 
cs

딕셔너리.items() 함수를 이용해서 key와 value를 한쌍씩 받을 수 있습니다.
그렇게 받은 키 값 쌍을 [0], [1] 처럼 인덱스를 이용해서 접근이 가능합니다.


2-5) get - 딕셔너리 키로 값 얻기

딕셔너리.get("key")를 이용해서 조금 더 안전하게 value에 접근 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 딕셔너리
= {'a'12'abc'"blog"'ff'343'name'}
 
# 값이 없을때 get 접근
r1 = d.get('ccc')
print(f"d.get('ccc') : {r1}")
 
# 값이 없을때 [] 접근
# r2 = d['ccc']
# print(f"d['ccc']) : {r2}")
 
# 값이 있을때 get 접근
r3 = d.get('a')
print(f"d.get('a') : {r3}")
 
cs

딕셔너리.get() 함수는 이렇게 값이 없을때는 None을 반환합니다.
그런데 딕셔너리[] 로 접근할때 값이 없으면 에러가 납니다.
이렇게 딕셔너리[] 접근은 값이 없을때 에러가 나기 때문에 안정성이 조금 떨어질 수 있습니다.
그렇기 때문에 딕셔너리.get() 함수로 확인하는것도 좋은 방법 입니다.


2-6) del - 딕셔너리에서 키, 값 한쌍 지우기

del 딕셔너리[키] 를 통해서 한쌍의 키,값을 지울 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
# 딕셔너리
= {'a'12'abc'"blog"'ff'343'name'}
 
print(f'before : {d}')
 
del d['a']
del d['ff']
# del d['aaaa'] 없는 키를 지우려고 하면 error
 
print(f'after : {d}')
 
cs

이렇게 del 딕셔너리[키]를 이용해서 딕셔너리의 데이터 한쌍을 지울 수 있습니다.
하지만 예제에서 보여 드린것 처럼 없는 키를 지우려고 하면 ERROR가 발생하게 됩니다.

그렇기 때문에 위에서 설명드렸던 get으로 해당 키와 값이 딕셔너리에 있는지 확인하고, 그 후 del 함수로 딕셔너리 데이터를 지우는 것이 좋을것 같습니다.


2-7) clear - 딕셔너리 키, 값 모두 지우기

clear 딕셔너리 를 이용해서 딕셔너리를 클리어 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
# 딕셔너리
= {'a'12'abc'"blog"'ff'343'name'}
 
print(f'before : {d}')
 
# 딕셔너리 클리어
d.clear()
 
print(f'after : {d}')
 
cs

딕셔너리.clear() 함수를 이용하면 딕셔너리 내부 데이터를 지울 수 있습니다.
, 비어있는 딕셔너리로 만들 수 있습니다.


3. 파이썬 딕셔너리 예제 


딕셔너리의 값을 클래스 객체로 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 연락처 클래스 만들기
class Contact:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
 
    def print_info(self):
        print(f"이름 : {self.name}, 나이 : {self.age}, 성별 : {self.gender}")
 
 
# 딕셔너리 생성과 동시에 키,값 하나 세팅
= {'kim': Contact('kim'29'man')}
 
# 딕셔너리에 클래스 객체를 값으로 추가1
p1 = Contact('park'43'woman')
d[p1.name] = p1
 
# 딕셔너리에 클래스 객체를 값으로 추가2
p2 = Contact('blockdmask'20'man')
d['blockdmask'= p2
 
# 딕셔너리에 클래스 객체를 값으로 추가3
d['lee'= Contact('lee'35'woman')
 
 
 
# 출력1 : 딕셔너리 키 출력
print('1. Keys')
print(d.keys())
 
# 출력2 : 딕셔너리 값 출력
print()
print('2. Values')
for k in d.keys():
    d[k].print_info()
 
cs

이렇게 우리가 긱접 만든 클래스를 딕셔너리의 "value"로 집어 넣을 수 있습니다.
물론 위에서 한번 언급했듯이 불변하는 객체라면 "key"로도 사용할 수 있습니다.
이 예제에서는 딕셔너리의 "value"로 클래스 객체를 이용하는 방법을 보여드렸습니다.
간단하죠?


여기까지 파이썬 딕셔너리 데이터 타입에 대해서 알아보았습니다. 도움이 되었나요?
끝까지 읽어주셔서 감사합니다.

반응형