딕셔너리란?
<Key, Value>
의 한 쌍을 가지는 자료형을 말한다.
예를 들어 영한사전에서 Key : baseball을 찾으면 Value: 야구를 얻을 수 있다.
딕셔너리는 리스트나 튜플처럼 순차적으로 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다.
이것이 바로 딕셔너리의 가장 큰 특징이다.
baseball 이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball 이라는 단어가 있는 곳만 펼쳐보는 것이다.
딕셔너리는 어떻게 만들까?
ex.
dic = {'name':'pey', 'phone':'0119993323', 'birth': '1118'}
으로 딕셔너리를 만들게 되면 딕셔너리 dic은
이렇게 만들어지게 된다.
다음 예는 Key로 정수값 1, Value로 문자열 'hi'를 사용한 예이다.
a = {1: 'hi'}
다음과 같이 Value에 리스트를 넣을 수도 있다.
a = { 'a': [1,2,3]}
딕셔너리 쌍 추가,삭제하기
(1) 딕셔너리 쌍 추가하기
a = {1 : 'a'}
a[2] = 'b'
print(a)
{1: 'a', 2: 'b'}이 출력됨을 볼 수 있다.
a[2] = b
는 딕셔너리 a에 Key가 2이고 Value가 'b'인 쌍을 추가한다는 의미이다.
(2) 딕셔너리 요소 삭제하기
del a[Key]
딕셔너리 a에서 Key에 해당하는 Key:Value쌍을 삭제한다는 의미이다.
딕셔너리를 사용하는 방법
요솟값 얻기
리스트나 튜플, 문자열은 인덱싱, 슬라이싱 기법 중 하나를 사용했으나
딕셔너리는 Key를 사용해 Value를 구하는 방법 뿐이다.
딕셔너리변수이름[Key]
를 사용하면 해당 딕셔너리에서 Key에 해당하는 Value를 얻을 수 있다.
딕셔너리 만들 때 주의 사항
ex.
a = {1 : 'a'}
a[1] = 'b'
a[1] = 'c'
print(a)
print(a[1])
print(a[1])
print(a[1])
{1: 'c'}
c
c
c
이 출력됨을 볼 수 있다.
나머지 값들은 다 덮어써지고 1 : 'c'만 남아 Key 1에 해당하는 Value를 출력하면 'c'만 계속 출력된다.
하지만 튜플은 Key로 쓸 수 있다.
딕셔너리의 Key로 쓸 수 있느냐 없느냐는 Key가 immutable인지 아닌지 인데
리스트 a의 경우 객체의 레퍼런스가 변하지 않아도 안의 값이 변할 수 있다.
하지만 튜플은 같은 레퍼런스에 다른 튜플이 올 수 없고, 문자열 역시 마찬가지므로 Key로 쓸 수 있다.
Value 로는 immutable 이든 아니든 들어갈 수 있다.
딕셔너리 관련 함수들
a = {'name' : 'pey', 'phone' : '0119993323'}
x = a.keys()
print(x)
dict_keys(['name', 'phone'])
이 출력됨을 볼 수 있다.
파이썬 2.7까지는 dict_keys가 아닌 리스트를 돌려주는데 리스트를 돌려주기 위해서는 메모리 낭비가 발생하는데 이러한 메모리 낭비를 줄이기 위해 dict_keys 객체를 리턴한다.
만약 3.0 이후 버전에서 리턴값으로 리스트가 필요한 경우에는 list(a.keys())를 사용하면 된다.
(str(x)와 같은 맥락의 형변환)
dict_keys, dict_values, dict_items 등은 리스트로 변환하지 않더라도 기본적인 반복 구문을 실행할 수 있다.
dict_keys 객체는 리스트를 사용하는 것과 거의 차이는 없지만 리스트 고유의 append, insert, pop, remove, sort함수는 실행할 수 없다.
Value리스트 만들기(values)
key 리스트를 얻는 것과 마찬가지 방법으로 dict_values 객체를 리턴한다.
Key,Value 쌍 얻기(items)
a = {'name' : 'pey', 'phone' : '0119993323'}
x = a.items()
print(x)
dict_items([('name', 'pey'), ('phone', '0119993323')])
가 출력됨을 볼 수 있다.
각각의 item은 튜플임을 출력에서 확인할 수 있다.
Key, Value 쌍 모두 지우기(clear)
a.clear()
Tip. 빈 딕셔너리도 () 로 표현한다.
Key로 Value얻기 (get)
a.get(x)는 딕셔너리 a에서 Key x에 대응되는 Value 를 리턴한다.
이는 a[x]와 같다고 생각할 수 있으나
a[x]는 존재하지 않는 키에 대해서 찾을 시 Key 에러 가 발생하고
a.get[x]는 None을 리턴한다.
(None은 C에서 Null에 대응된다.)
a = {'name' : 'pey', 'phone' : '0119993323'}
print(a.get("noKey"))
print(a["noKey"])
처음에는 None이 출력
그다음에는 KeyError: 'noKey'가 출력된다.
이 둘의 결정적인 차이는 에러가 발생하면 코드가 더이상 실행이 안된다는 것이다.
딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, '디폴트 값')을 사용하면 편리하다.
a = {'name' : 'pey', 'phone' : '0119993323'}
print(a.get("noKey","No Key"))
No key 가 출력되는 것을 볼 수 있다.
해당 Key가 딕셔너리 안에 있는지 조사하기 (in)
a = {'name' : 'pey', 'phone' : '0119993323'}
print('name' in a)
print('no Key' in a)
각각 true 와 flase 가 리턴됨을 알 수 있다.