Github blog a production story
Shortcut
파이썬(Python) 07 : 자료형 - 딕셔너리 자료형
딕셔너리 자료형
사람은 누구든지 “이름” = “홍길동”, “생일” = “몇 월 며칠” 등과 같은 방식으로 그 사람이 가진 정보를 나타낼 수 있다. 파이썬은 영리하게도 이러한 대응 관계를 나타낼 수 있는 딕셔너리(dictionary) 자료형을 가지고 있다. 이번에는 이 자료형에 대해 알아보자.
요즘 사용하는 대부분의 언어도 이러한 대응 관계를 나타내는 자료형을 가지고 있는데 이를 딕셔너리라고 하고, ‘연관 배열(associative array)’또는 ‘해시(hash)’라고도 한다.
1. 딕셔너리란?
딕셔너리는 단어 그대로 ‘사전’이라는 뜻이다. 즉 “people”이라는 단어에 “사람”, “baseball”이라는 단어에 “야구”라는 뜻이 부합되듯이 딕셔너리는 Key와 Value를 한 쌍으로 가지는 자료형이다. 예컨대 Key가 “baseball”이라면 Value는 “야구”가 될 것이다.
딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. baseball이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 baseball이라는 단어가 있는 곳만 펼쳐 보는 것이다.
2. 딕셔너리는 어떻게 만들까?
{Key1: Value1, Key2: Value2, Key3: Value3, ...}
>>> dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
딕셔너리 dic의 정보
key | value |
---|---|
name | pey |
phone | ‘010-9999-1234’ |
birth | ‘1118’ |
>>> a = {1: 'hi'}
>>> a
{1: 'hi'}
>>> a = {'a': [1, 2, 3]}
>>> a
{'a': [1, 2, 3]}
3. 딕셔너리 쌍 추가, 삭제
3-1. 딕셔너리 쌍 추가
>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}
>>> a['name'] = 'pey'
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> a[3] = [1, 2, 3]
>>> a
{1: 'a', 2: 'b', 'name': 'pey', 3: [1, 2, 3]}
3-2. 딕셔너리 쌍 삭제
>>> del a[1]
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}
4. 딕셔너리 주의사항
딕셔너리에서 Key는 고유한 값이므로 중복되는 Key 값을 설정해 놓으면 하나를 제외한 나머지 것들이 모두 무시된다는 점에 주의해야 한다. 다음 예에서 볼 수 있듯이 동일한 Key가 2개 존재할 경우, 1: ‘a’ 쌍이 무시된다.
>>> a = {1:'a', 1:'b'}
>>> a
{1: 'b'}
이렇게 Key가 중복되었을 때 1개를 제외한 나머지 Key: Value 값이 모두 무시되는 이유는 Key를 통해서 Value를 얻는 딕셔너리의 특징 때문이다. 즉, 딕셔너리에는 동일한 Key가 중복으로 존재할 수 없다.
Key에 리스트는 쓸 수 없다는 것이다. 하지만 튜플은 Key로 쓸 수 있다. 딕셔너리의 Key로 쓸 수 있느냐, 없느냐는 Key가 변하는(mutable) 값인지, 변하지 않는(immutable) 값인지에 달려 있다. 리스트는 그 값이 변할 수 있기 때문에 Key로 쓸 수 없다. 다음 예처럼 리스트를 Key로 설정하면 리스트를 키 값으로 사용할 수 없다는 오류가 발생한다.
>>> a = {[1,2] : 'hi'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> a = {(1,2) : 'hi'}
>>> a
{(1, 2): 'hi'}
5. 딕셔너리 관련 함수
5-1. keys
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
>>> for k in a.keys():
... print(k)
...
name
phone
birth
>>> list(a.keys())
['name', 'phone', 'birth']
5-2. values
>>> a.values()
dict_values(['pey', '010-9999-1234', '1118'])
5-3. items
>>> a.items()
dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
items 함수는 Key와 Value의 쌍을 튜플
로 묶은 값을 dict_items 객체로 리턴한다.
5-4. clear
>>> a.clear()
>>> a
{}
빈 리스트를 [], 빈 튜플을 ()로 표현하는 것과 마찬가지로 빈 딕셔너리도 {}로 표현한다.
5-5. get
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.get('name')
'pey'
>>> a.get('phone')
'010-9999-1234'
a.get('name')
은 a['name']
을 사용했을 때와 동일한 결괏값을 리턴한다.
딕셔너리에 존재하지 않는 키로 값을 가져오려고 할 경우, a['none']
방식은 오류를 발생시키고 a.get('none')
방식은 None을 리턴한다는 차이가 있다.
>>> print(a['none'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'none'
>>> print(a.get('none'))
None
딕셔너리 안에 찾으려는 Key가 없을 경우, 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때는 get(x, ‘디폴트 값’)을 사용하면 편리하다.
>>> a.get('none', 'default')
'default
5-6. in
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>>> 'name' in a
True
>>> 'email' in a
False
‘name’ 문자열은 a 딕셔너리의 Key 중 하나이다. 따라서 ‘name’ in a를 호출하면 참(True)을 리턴한다. 이와 반대로 ‘email’은 a 딕셔너리 안에 존재하지 않는 Key이므로 거짓(False)을 리턴한다.
댓글남기기