파이썬 딕셔너리 (Dictionary)

파이썬 딕셔너리(Dictionary) – 파이썬 자료형 4편

사전의 특성과 딕셔너리 자료형

영어 단어 딕셔너리(Dictionary) 는 우리 말로 ‘사전’이라는 뜻입니다. 이번에 소개할 자료형의 이름도 바로 이 딕셔너리입니다. 자료형에 대한 소개를 하기 전에 먼저 이 사전에 대한 특징을 살펴보죠.

dictionary-390055_1280

 

사전은 어떤 단어와 그 단어에 대한 설명을 모아놓은 책입니다. 사전 내 단어끼리는 절대 중복되지 않습니다. 영한사전에서 ‘Apple’이 10페이지와 200페이지 두 군데 나타나지는 않는 것 처럼 말이지요. 또한 보통 알파벳 첫 글자로 색인(인덱싱 Indexing)이 되어 있기 때문에 사용자가 매우 빠르게 단어를 찾을 수 있습니다. ‘star’ 라는 단어를 검색하자고 A 부터 차례차례 찾지는 않죠. 자 여기서 사전의 큰 특징이 나오는데요.

  1. 한 단어에 하나의 설명이 있다.
  2. 단어는 절대 중복되지 않는다.
  3. 색인이 있어서 매우 빠르게 찾을 수 있다.

딕셔너리 자료형도 사전과 같은 특징을 가집니다.

  1. 키(Key) 하나에 하나의 값(Value)이 있다.
  2. 키는 절대 중복되지 않는다.
  3. 매우 빠르게 찾을 수 있다.

이 자료형은 매우 유용해서 다른 언어에서도 언어 자체 혹은 표준 라이브러리를 통해서 많이 지원합니다. 자바의 Hash나 Go언어의 Map 과 같은 자료형입니다. 요즘 REST API 에서 많이 사용하는 JSON도 이와 같이 키와 값으로 이루어진 형태입니다.

딕셔너리 만들기

딕셔너리는 아래와 같은 형태를 지니고 있습니다.

D = {'type' : 'fighter', 'name' : 'X-Wing', 'code_name' : 'T-65', 'manufacture' : 'Incom'}

중 괄호({})로 둘러 싸고, 그 안에 콤마(,)로 아이템을 구분합니다. 한 아이템은 ‘KEY : VALUE’ 형태로 구성되어 있습니다. 문자열과 숫자형, 튜플을 KEY를 사용할 수 있으며 VALUE는 어떤 자료형이 오던 상관없습니다.

D = {1 : "I'm", 2: 'Your', 'father' : 3, 4 : 200}

딕셔너리 연산

딕셔너리는 앞서 설명한 문자열(string), 리스트(list)과 같은 시퀀스(sequence) 자료형이 아니기 때문에 시퀀스 자료형에서 파생된 연산은 이 딕셔너리 자료형에 적용할 수 없습니다.

키를 통해 값을 가져오기

가장 기본적인 연산이자, 가장 중요한 연산이며 딕셔너리의 존재 이유기도 합니다. 만약 해당 키와 값이 존재한다면 키를 통해 해당 값을 가져올 수 있습니다.

>>> D = {'type' : 'Jedi', 'grade' : 'Padawan', 'name' : 'Obi-Wan Kenobi'}
>>> D['name'] #키 'name' 의 값을 불러옵니다.
'Obi-Wan Kenobi'
>>> D['grade'] #키 'grade' 의 값을 불러옵니다.
'Padawan'

시퀀스 자료형에서 [] 안에는 숫자만 들어가야 했고, 시퀀스 자료형의 순서를 조작하기 위함이라면 딕셔너리에서는 키 값을 표현하기 위해 사용한다는 점이 다릅니다.

다만, 딕셔너리에 키가 존재하지 않는 키로 값을 부르면 KeyError 예외가 발생합니다. (예외처리 방법은 여기!)

 >>> D['lightsaber']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'lightsaber'

이 방법 외에도 get() 을 사용해서 값을 가져올 수 있습니다. get(키, default=None) 형태입니다. [] 를 이용해서 딕셔너리에 접근했는데 해당 키가 없으면 기본적으로 예외가 발생하지만, get()을 사용하면 예외가 발생하지 않고 두 번째 인자값을 반환합니다.

>>> D = {'a' : 10, 'b': 20, 'c': 30}
>>> D.get('a')
10
>>> D.get('e')
>>> D.get('e', 0) # 키 'e' 가 없으면 0을 반환합니다.
0

파이썬 딕셔너리 추가, 변경

딕셔너리 값을 추가하는 방법은 간단합니다. “딕셔너리 변수[키A] = 값A” 형태로 키A와 값A의 쌍을 딕셔너리 변수에 추가할 수 있습니다.

>>> D = {} # 빈 딕셔너리를 생성합니다. {} 대신 dict()를 사용해도 됩니다.
>>> D['age'] = 22
>>> D
{'age' : 22}

딕셔너리 값 변경은 추가 방법과 같습니다. 다만 키는 딕셔너리에 있어야겠죠? : )

>>> D
{'age' : 22}
>>> D['age'] = 100
>>> D
{'age': 100}

파이썬 딕셔너리 삭제

파이썬 딕셔너리의 아이템을 삭제하고자 할 때는 내장함수 del()을 사용합니다.

>>> D = {'type' : 'Jedi', 'grade' : 'Padawan', 'name' : 'Obi-Wan Kenobi'}
>>> del D['grade']
>>> D
{'type' : 'Jedi', 'name' : 'Obi-Wan Kenobi'}

파이썬 딕셔너리 키, 값 쌍 얻기 items()

items() 함수는 딕셔너리의 키와 값을 튜플로 묶어서 리스트 형태로 반환합니다.

>>> D = {'a' : 10, 'b': 20, 'c': 30}
>>> D.items()
[ ('a', 10), ('b', 20), ('c', 30)]

파이썬 딕셔너리 합치기

크게 2가지 방법이 있습니다.

  1. update() 함수 사용
  2. items() 함수 사용 및 더하기 연산

첫 번째 방법인 A.update(딕셔너리 B) 는 A의 딕셔너리에 B를 더합니다. 이 경우 딕셔너리 A의 값이 변경됩니다. 만약 A와 B 모두 같은 키가 있다면 B의 키 값으로 덮어 씌웁니다.

>>> A = {'foo': 10, 'bar' : 20}
>>> B = {'bar' : 30, 'zoo', 40} #'bar' 값을 주의해서 봐주세요!
>>> A.update(B)
>>> A
{'foo': 10, 'bar' : 30, 'zoo' : 40}

두 번째 방법은 딕셔너리의 items() 함수를 사용하는 것입니다.

>>> A = {'foo': 10, 'bar' : 20}
>>> B = {'bar' : 30, 'zoo': 40}
>>> C = dict(A.items() + B.items())
>>> C
{'foo' : 10, 'bar': 30, 'zoo': 40}

다만 두 번째 방법은 딕셔너리 크기가 클 경우 성능 상 문제가 있으니 사용을 자제하시기 바랍니다.

파이썬 딕셔너리 초기화 clear()

딕셔너리를 초기화시키고 싶을 때, clear()를 사용합니다.

>>> D = {'a' : 10, 'b' : 20}
>>> D.clear()
>>> D
{}

파이썬 딕셔너리 검색 : 딕셔너리 안에 해당 키가 있는지 검사

딕셔너리에 특정 키 값이 존재하는지 확인하고자 할 때 in 연산자를 사용합니다.

>>> D = {'a': 10, 'b' : 20}
>>> 'b' in D
True
>>> 'c' in D
False

in 은 여기저기 자주 사용하는 연산자이기 때문에 추후 다시 한 번 설명하겠습니다.

파이썬 딕셔너리 키 값만 가져오기 keys()

딕셔너리에서 키 값만 가져오고 싶을 때가 있습니다. 이 경우 keys() 함수를 사용하면 됩니다.

>>>D = {'a' : 10, 'b' : 20, 'c': 30}
>>>D.keys()
['a', 'b', 'c']

keys() 함수의 결과로 키만 리스트 형태로 반환합니다. keys() 함수는 2.7과 3.x 의 동작이 다른데요, 2.7은 리스트 자료형을 반환하지만, 3.X는 dict_keys 자료형으로 반환합니다. dict_keys 는 일종의 리스트 형태지만 리스트는 아니므로, 리스트 연산(insert,append) 등을 사용할 수 없습니다. dict_keys 자료형을 리스트로 변환하려면 list(D.keys()) 를 사용합니다.

>>> D = {'a' : 10, 'b' : 20, 'c': 30}
>>> list(D.keys())
['a', 'b', 'c']

참고자료

  1. 파이썬 공식문서

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *