Unit 26. 딕셔너리 사용하기

우리가 영어를 공부할 때 모르는 단어가 나오면 영어 사전에서 찾아보죠? 다음과 같이 사전은 단어와 설명 형태로 이루어져 있습니다.

python: 명사. (동물) 비단뱀, 이무기, (그리스신화) 거대한 

파이썬에서는 사전과 비슷한 형태의 자료형을 제공하는데 이름 그대로 딕셔너리(dictionary)라고 부릅니다. 영어 단어 python을 딕셔너리 자료형으로 표현하면 다음과 같은 모양이 됩니다.

딕셔너리

{'python': '명사. (동물) 비단뱀, 이무기, (그리스신화) 거대한 뱀'}

이처럼 딕셔너리 자료형은 서로 연관 관계가 있는 값을 묶어서 표현할 때 사용합니다. 단순히 여러 값만 나열하는 리스트와는 다른 점입니다.

리스트

['pylon', 'Pythagoras', 'python'] 

이번 유닛부터 딕셔너리를 만드는 방법과 기본 사용 방법을 알아보겠습니다.

26.1 딕셔너리를 만들기

딕셔너리는 { }(중괄호) 안에 키: 값 형식으로 저장하며 각 키와 값은 ,(콤마)로 구분해줍니다.

  • 딕셔너리 = {키1: 값1, 키2: 값2}

그럼 키와 값이 5개씩 들어있는 딕셔너리를 만들어보겠습니다.

>>> x = {'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
>>> x
{'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50}
  • SyntaxError: invalid syntax: { }의 짝이 맞지 않을 때, 키:값 형식에 맞지 않을 때, 키 문자열의 ' ' 짝이 맞지 않을 때, 각 키:값을 구분할 때 ,를 넣지 않아서 발생하는 에러입니다. { }, ' ' 짝이 맞는지, 키:값 형식에 맞는지, ,를 빠뜨리지 않았는지 확인해주세요.

딕셔너리는 키를 먼저 지정하고 :(콜론)을 붙여서 값을 표현합니다. 특히 키에는 값을 하나만 지정할 수 있으며 이런 특성을 따서 키-값 쌍(key-value pair)이라 부릅니다(키-값은 1:1 대응).

그럼 딕셔너리를 만들 때 키 이름이 중복되면 어떻게 될까요? (파이썬 3.6 기준)

>>> x = {'a': 10, 'a': 20, 'c': 30, 'd': 40, 'e': 50}
>>> x['a']    # 키가 중복되면 가장 뒤에 있는 값만 사용함
20
>>> x    # 중복되는 키는 저장되지 않음
{'a': 20, 'c': 30, 'd': 40, 'e': 50}

딕셔너리 x를 만들 때 'a': 10이 있고 그 뒤에 'a': 20을 넣었습니다. 즉, 키 'a'가 중복됩니다. 이 상태에서 x['a']를 출력해보면 20이 나옵니다. 즉, 딕셔너리에 키와 값을 저장할 때 키가 중복되면 가장 뒤에 있는 값만 사용합니다. 따라서 중복되는 키는 저장되지 않습니다.

딕셔너리의 키는 문자열뿐만 아니라 정수, 실수, 불도 사용할 수 있으며 자료형을 섞어서 사용해도 됩니다. 그리고 값에는 리스트, 딕셔너리 등을 포함하여 모든 자료형을 사용할 수 있습니다.

>>> x = {100: 'hundred', False: 0, 3.5: [3.5, 3.5]}
>>> x
{100: 'hundred', False: 0, 3.5: [3.5, 3.5]}

단, 키에는 리스트와 딕셔너리를 사용할 수 없습니다.

>>>x = {[10, 20]: 100}
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
   x = {[10, 20]: 100}
TypeError: unhashable type: 'list'
>>> x = {{'a': 10}: 100}
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    x = {{'a': 10}: 100}
TypeError: unhashable type: 'dict'

빈 딕셔너리를 만들 때는 { }만 지정하거나 dict를 사용하면 됩니다.

  • 딕셔너리 = {}
  • 딕셔너리 = dict()
>>> x = {}
>>> x
{}
>>> y = dict()
>>> y
{}

특히 dict는 빈 딕셔너리뿐만 아니라 다양한 방법으로 딕셔너리를 만들 수 있습니다.

  • 딕셔너리 = dict(키1=값2, 키2=값2)
  • 딕셔너리 = dict(zip([키1, 키2], [값1, 값2]))
  • 딕셔너리 = dict([(키1, 값1), (키2, 값2)])
  • 딕셔너리 = dict({키2: 값1, 키2: 값2})

먼저 다음과 같이 dict에서 키=값 형식으로 딕셔너리를 만들 수 있습니다. 이때는 키에 ' '(작은따옴표)나 " "(큰따옴표)를 사용하지 않아야 합니다. 키는 딕셔너리를 만들고 나면 문자열로 바뀝니다.

>>> x1 = dict(a=10, b=20, c=30)                      # 키=값 형식으로 딕셔너리를 만듦
>>> x1
{'a': 10, 'b': 20, 'c': 30}

두 번째 방법은 dict에서 zip 함수를 이용하여 리스트 두 개를 딕셔너리로 만드는 방법입니다. zip에는 키가 들어있는 리스트와 값이 들어있는 리스트를 차례대로 넣어주면 됩니다(zip은 '부록 48.3 내장 함수'를 참조해주세요).

>>> x2 = dict(zip(['a', 'b', 'c'], [10, 20, 30]))    # zip을 이용하여 리스트 두 개를 딕셔너리로 만듦
>>> x2
{'a': 10, 'b': 20, 'c': 30}

세 번째 방법은 리스트 안에 (키, 값) 형식의 튜플을 나열하는 방법입니다.

>>> x3 = dict([('a', 10), ('b', 20), ('c', 30)])     # (키, 값) 형식의 튜플로 딕셔너리를 만듦
>>> x3
{'a': 10, 'b': 20, 'c': 30}

네 번째 방법은 dict 안에서 중괄호로 딕셔너리를 생성하는 방법입니다.

>>> x4 = dict({'a': 10, 'b': 20, 'c': 30})           # dict 안에서 중괄호로 딕셔너리를 만듦
>>> x4
{'a': 10, 'b': 20, 'c': 30}

그럼 조금 응용해서 zip, range로 딕셔너리를 만들어볼까요?

>>> x = dict(zip(range(1, 11), [2 ** i for i in range(1, 11)]))
>>> x
{1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024}

먼저 range(1, 11)로 1부터 10까지 리스트를 만들었습니다. 그리고 [2 ** i for i in range(1, 11)]로 21부터 210까지 2의 거듭제곱 리스트를 만든 뒤에 zip으로 두 리스트를 합쳤습니다. 그리고 마지막으로 dict를 사용해서 딕셔너리로 만들었습니다.

딕셔너리는 키를 통해 값의 의미를 파악하기가 쉽습니다. 여기서는 딕셔너리를 연습하기 위해서 a, b 등의 키를 사용했지만 실제로는 뜻이 명확한 키를 사용합니다. 예를 들어 딕셔너리로 게임 캐릭터 능력치를 저장한다면 키 이름은 health, mana, armor 등 캐릭터 능력치에 해당하는 단어를 사용합니다. 정리하자면 딕셔너리는 연관된 값들을 모아둘 때 주로 사용합니다.