안녕하세요. 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. 딕셔너리 생성 d = {'a': 123123} # 2. 값 추가 d[999] = 10 # 숫자 키, 숫자 값 d['99'] = 111 # 문자 키, 숫자 값 d['BlockDMask'] = "blog" # 문자 키, 문자 값 d['wow'] = [1, 2, 3, 4, 5] # 문자 키, 리스트 값 d[(1, 2)] = "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 | # 딕셔너리 생성 d = {'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 | # 딕셔너리 d = {'a': 123123, 'kim': 'blockdmask', 'b': "blog", 'c': 3333, 123: '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 | # 딕셔너리 d = {'a': 123123, 'kim': 'blockdmask', 'b': "blog", 'c': 3333, 123: '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 | # 딕셔너리 d = {'a': 123123, 'kim': 'blockdmask', 'b': "blog", 'c': 3333, 123: '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 | # 딕셔너리 d = {'a': 12, 'abc': "blog", 'ff': 3, 43: '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 | # 딕셔너리 d = {'a': 12, 'abc': "blog", 'ff': 3, 43: '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 | # 딕셔너리 d = {'a': 12, 'abc': "blog", 'ff': 3, 43: '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}") # 딕셔너리 생성과 동시에 키,값 하나 세팅 d = {'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"로 클래스 객체를 이용하는 방법을 보여드렸습니다.
간단하죠?
여기까지 파이썬 딕셔너리 데이터 타입에 대해서 알아보았습니다. 도움이 되었나요?
끝까지 읽어주셔서 감사합니다.
'<개인공부> > [Python]' 카테고리의 다른 글
[python] 파이썬 문자열 String 메서드 정리 (count, find, upper, lower, strip, replace) (1) | 2021.01.01 |
---|---|
[python] 파이썬 문자열 String 정리 (문자열 합치기, 자르기, 인덱싱 등) (0) | 2020.12.30 |
[python] 파이썬 파일읽기, 파일쓰기 (open , close, write, read, tell, seek) (0) | 2020.12.23 |
[python] 파이썬 set (집합) 자료형 정리 및 예제 (0) | 2020.12.18 |
[python] 파이썬 튜플(tuple)에 대해서 (0) | 2020.12.06 |
[Python] 파이썬 클래스2 상속, 추상 클래스, 메서드 오버라이딩 (0) | 2020.11.29 |
[python] 파이썬 클래스1 클래스(class), 객체(object), 생성자, 메서드 (9) | 2020.11.22 |
[python] 파이썬 함수 정리와 예제 (def) (5) | 2020.11.08 |