사전(Dictionary)

  • 해시테이블(hash table) 또는 딕셔너리 라고도 불린다.

(도시, 온도) 형태의 항목들로 이루어진 시퀀스 자료형을 만들어보자. 예를 들어 리스트 또는 튜플을 활용할 수 있다.

L = [['평택', 22], ['수원', 18], ['제주', 25]]

만들기는 어렵지 않다. 하지만 만들고 나서 활용하기가 좀 귀찮다. 예를 들어 수원의 온도를 알고 싶으면?

  • 방법 1: 인덱싱을 이용한다.

In [2]:
L = [['평택', 22], ['수원', 18], ['제주', 25]]

In [3]:
L[1][1]


Out[3]:
18

그런데 이 방식은 인덱스 번호를 알고 있을 때만 가능하다. 리스트의 길이가 좀 만 길어지면 사용이 사실상 불가능한 방식이다.

  • 방법 2: 반복문을 이용하여 탐색한다.

In [4]:
for city in L:
    if city[0] == '수원':
        print(city[1])


18

이방식은 시간이 매우 오래 걸릴 수 있다. 리스트의 길이가 1억인 경우 꽤 오래 기다릴 수 있다.

Lab-08을 보면 시간이 매우 오래 걸릴 수 있음을 확인할 수 있다.

대안: 사전 자료형 활용

이와같이 빠르게 정보를 찾고자 할 때는 사전 자료형을 이용하는 것이 좋다.

사전 자료형에 대한 이해는 어학공부에 사용하는 사전을 떠올리면 쉽다. 영어 사전의 경우 '단어 와 뜻'으로 이루어진 쌍들의 집합이라고 생각할 수 있다. 사전 자료형도 동일하게 작동한다.

앞서 예제에서 사용된 도시와 온도의 정보를 사전 자료형으로 만들면 아래와 같다.

먼저 빈 사전을 선언한다.


In [5]:
Hash = {}

이제 원하는 자료들의 쌍을 입력한다. 예를 들어 '평택 온도는 22도' 라는 정보를 추가하고자 하면 아래와 같이 하면 된다.


In [6]:
Hash['Pyongtaek'] = 22

이제 평택의 정보가 추가되었음을 확인할 수 있다.


In [7]:
Hash


Out[7]:
{'Pyongtaek': 22}

이제 수원과 제주의 정보를 추가하고 확인해보자.


In [8]:
Hash['Suwon'] = 18
Hash['Jeju'] = 25
Hash


Out[8]:
{'Jeju': 25, 'Pyongtaek': 22, 'Suwon': 18}

키(key) 와 키값(value)

앞서 살펴보았듯 사전자료형의 항목들은 콜론(:)으로 구분된 두 개의 값들의 쌍으로 이루어진다. 왼쪽에 있는 값을 키(key), 오른쪽에 위치하는 값은 키값(value)라 부른다.

예를 들어 Hash에 사용된 키들은 Pyeongtaek, Suwon, Jeju 등이고 각 키들에 대응하는 키값은 각각 22, 18, 25이다. 키에 해당하는 키값을 확인하고자 하면 아래와 같이 명령하면 된다.


In [13]:
Hash['Pyongtaek']


Out[13]:
22

In [14]:
Hash['Jeju']


Out[14]:
25

사전에 사용된 키들만 따로 모아놓은 리스트를 만들어주는 사전 자료형 메소드가 있다.


In [16]:
H_keys = Hash.keys()
H_keys


Out[16]:
['Jeju', 'Pyongtaek', 'Anseong', 'Suwon']
주의: 도시명들의 순서에 주의하라. 알파벳 순도 아니다. 규칙이 없으며 전혀 중요하지 않다.

사전 자료형 반복문

사전자료형을 반복문에 활용할 수 있다. 이를 위해 keys 메소드를 사용한다.

예를 들어, 도시와 온도를 동시에 추출하여 모두 보여주고자 할 경우 아래와 같이 하면 된다.


In [18]:
for key in Hash.keys():
    print("{}의 온도는 {}이다.".format(key, Hash[key]))


Jeju의 온도는 25이다.
Pyongtaek의 온도는 22이다.
Anseong의 온도는 22이다.
Suwon의 온도는 18이다.

keys 메소드를 사용하지 않아도 내부적으로 동일하게 취급한다.


In [20]:
for key in Hash:
    print("{}의 온도는 {}이다.".format(key, Hash[key]))


Jeju의 온도는 25이다.
Pyongtaek의 온도는 22이다.
Anseong의 온도는 22이다.
Suwon의 온도는 18이다.

사전 자료형에 사용될 수 있는 메소드를 확인해보면 아래와 같다.


In [21]:
dir(Hash)


Out[21]:
['__class__',
 '__cmp__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'clear',
 'copy',
 'fromkeys',
 'get',
 'has_key',
 'items',
 'iteritems',
 'iterkeys',
 'itervalues',
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values',
 'viewitems',
 'viewkeys',
 'viewvalues']

pop, has_key, values 등에 대해서는 기본적으로 알고 있는 것이 좋다.


In [25]:
Hash.pop("Suwon")
Hash


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-25-cd4d76437179> in <module>()
----> 1 Hash.pop("Suwon")
      2 Hash

KeyError: 'Suwon'

In [26]:
Hash.has_key("Suwon")


Out[26]:
False

In [27]:
Hash.has_key("Jeju")


Out[27]:
True

In [28]:
Hash.values()


Out[28]:
[25, 22, 22]

파이썬 사전 자료형의 특징

  • 키에는 불변(immutable) 자료형만 사용될 쉬 있다. 즉, 숫자, 문자열, 튜플 등만 키로 사용된다.

  • 키값으로는 어떤 자료형도 사용 가능하다.

  • 사전 자료형은 매우 빠르게 정보를 취급한다. 경우에 따라 리스트 인덱싱보다 몇 십배 빠르다. (Lab-08 참조)

  • 사전 자료형은 모든 프로그래밍언어에서 제공된다. 활용법이 언어마다 다르지만 파이썬에서의 활용법은 상대적으로 훨씬 단순하다.