파이썬 프로그래밍 기초 - 딕셔너리 자료형
딕셔너리(dictionary)란?
리스트나 튜플처럼 순차적으로 해당 요솟값을 구하지 않고, Key를 통해 Value를 얻는다.
딕셔너리 자료형
파이썬은 대응관계를 나타낼 수 있는 딕셔너리 자료형('연관 배열' or '해시' 라고도 함)을 가지고 있다.
ex) "이름"="홍길동", "생일"="몇 월 며칠", "야구" = "baseball" ...
딕셔너리의 기본 모습
{Key1:Value1, Key2:Value2,Key3:Value3...}
딕셔너리 쌍 추가
>>> a={1:'a'}
>>> a[2]='b' # <= {2:'b'} 쌍 추가
>>> a
{1: 'a', 2: 'b'}
>>> a['name']='pey' # <= {'name':'pey'} 쌍 추거
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> a[3] = [1,2,3] # <= {3:[1,2,3]} 추가
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}
딕셔너리 요소 삭제하기
del 함수를 사용해서 'del a[key]'를 입력하면 지정한 Key에 해당하는 {Key:Value} 쌍이 삭제된다.
>>> del a[1] # <= Key가 1인 Key:Value 쌍 삭제
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}
딕셔너리 활용 방법
예를 들어 4명의 사람이 있다고 가정하고 각자의 특기를 표현할 수 있는 좋은 방법에 대해서 생각해보자.
리스트나 문자열로는 표현하기가 매우 까다로울 것이다.
하지만 파이썬의 딕셔너리를 사용하면 이 상황을 표현하기가 쉬워진다
{"김연아":"피겨스케이팅","박태환":"수영","손흥민":"축구"}
딕셔너리 활용
딕셔너리에서 Key를 사용해 Value를 얻기
- 딕셔너리는 Key를 사용해서 Value를 구한다.
아래 예시에서 'pey'라는 Key의 Value를 얻기 위해 grade['pey']를 사용한 것처럼,
어떤 Key의 Value를 얻기 위해서는 '딕셔너리_변수_이름[Key]'를 사용한다.
- 딕셔너리 변수에서 []안의 숫자는 Key에 해당하는 것을 나타낸다.
- 딕셔너리는 리스트나 튜플에 있는 인덱싱 방법을 적용할 수 없다.
>>> grade = {'pey':10, 'julliet':99}
>>> grade['pey']
10
>>> grade['julliet']
99
딕셔너리 만들 때 주의사항
1. 딕셔너리에서 Key는 고유한 값으로 중복되는 Key값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다.
동일한 Key가 2개 이상 존재할 경우 나머지들이 무시된다.
즉, Key를 통해서 Value를 얻는 딕셔너리의 특징 때문에 딕셔너리에는 동일한 Key가 중복으로 존재할 수 없다.
>>> a={1:'a',1:'b'} # <- 1이라는 Key가 중복되므로
>>> a
{1: 'b'} # <- 1:'a'쌍이 무시됨
2. Key에 리스트는 쓸 수 없지만, 튜플은 Key로 쓸 수 있다.
딕셔너리의 Key로 쓸 수 있냐 없냐는 Key가 변하는 값인지 변하지 않는 값인지에 달려있기 때문이다.
- 리스트로 Key값을 썼을 경우(변할 수 있기 때문에 Key로 쓰지 않는다.) - 오류 발생
>>> a = {[1,2]:'hi'}
Traceback (most recent call last):
File "<python-input-25>", line 1, in <module>
a = {[1,2]:'hi'}
^^^^^^^^^^^^
TypeError: unhashable type: 'list'
=> 그러나 Value에는 변하는 값이든 변하지 않는 값이든 아무 값이나 넣을 수 있다.
딕셔너리 관련 함수
Key 리스트 만들기 - keys
a.keys()는 딕셔너리 a의 Key만을 모아 dict_keys 객체를 리턴한다.
>>> a={'name':'pey','phone':'010-9999-1234','birth':'1118'}
>>> a
{'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
- dict_keys 객체의 사용
-> 리스트 사용하는 것과 별 차이는 없지만 리스트 고유의 append,insert,pop,remove,sort 함수 수행 불가
>>> for k in a.keys() :
... print(k)
...
name
phone
birth
dict_keys 객체를 리스트로 변환하려면 다음과 같다.
>>> list(a.keys())
['name', 'phone', 'birth']
Value 리스트 만들기 - values
>>> a.values()
dict_values(['pey', '010-9999-1234', '1118'])
Key, Value 쌍 얻기 - items
>>> a.items()
dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
Key:Value 쌍 모두 지우기 - clear
딕셔너리 안의 '모든' 요소를 삭제한다.
>>> a.clear()
>>> a
{}
Key로 Value 얻기 - get
get(x) 함수는 x라는 Key에 대응되는 Value를 리턴한다.
a.get(x)는 a['name']을 사용했을 때와 동일한 결괏값을 리턴한다.
>>> a={'name':'pey','phone':'010-9999-1234','birth':'1118'}
>>> a.get('name')
'pey'
>>> a.get('phone')
'010-9999-1234'
다만, 딕셔너리에 존재하지 않는 Key로 Value를 가져오려고 하는 경우에는 오류를 발생시키고
.get(x)은 None을 리턴한다. (여기서 None은 거짓이라는 의미이다.)
>>> a={'name':'pey','phone':'010-9999-1234','birth':'1118'}
>>> print(a.get('nokey'))
None
>>> print(a['nokey'])
Traceback (most recent call last):
File "<python-input-42>", line 1, in <module>
print(a['nokey'])
~^^^^^^^^^
KeyError: 'nokey'
get(x, 디폴트 값) - 딕셔너리 안에 찾으려는 Key가 없는 경우, 미리 정해둔 디폴트 값 가져오기
>>> a.get('nokey','foo')
'foo'
딕셔너리 a에는 'nokey'에 해당한느 key가 없으므로 디폴트값인 'foo'를 리턴한다.
해당 Key가 딕셔너리 안에 있는지 조사하기 - in
Key가 딕셔너리 안에 존재하면 True / 존재하지 않으면 False를 반환한다.
>>> a={'name':'pey','phone':'010-9999-1234','birth':'1118'}
>>> 'name' in a
True
>>> 'email' in a
False