Skip to content

5. 딕셔너리(Dictionary)


1. 키워드

  • 딕셔너리(Dictionary)
  • 키-값 쌍(Key-Value Pair)
  • 해시(Hash)


2. 딕셔너리 사용하기

  • 파이썬에서는 연관된 값을 묶어서 저장하는 용도로 딕셔너리라는 자료형을 제공한다.
  • 딕셔너리는 값마다 이름을 붙여서 저장하는 방식이다.


3. 딕셔너리 만들기

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


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


  • 다음과 같이 키와 값이 4개씩 들어있는 딕셔너리를 만들어보자.


>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


  • 딕셔너리는 키를 먼저 지정하고 :(콜론)을 붙여서 값을 표현한다.
  • 특히 키에는 값을 하나만 지정할 수 있으며 이런 특성을 따서 키-값 쌍(Key-Value Pair)이라고 부른다.


1) 키 이름이 중복되면?

  • 다음과 같이 딕셔너리를 만들 때 키 이름이 중복되도록 만들어보자.


>>> lux = {"health": 490, "health": 800, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux["health"]
800
>>> lux
{'health': 800, 'mana': 334, 'melee': 550, 'armor': 18.72}


  • 딕셔너리 lux를 만들 때 "health": 490이 있고 그 뒤에 "health": 800을 넣었다.
  • 즉, 키 "health"가 중복된다.
  • 이 상태에서 lux["health"]를 출력해 보면 800이 나온다.
  • 즉, 딕셔너리에 키와 값을 저장할 때 키가 중복되면 가장 뒤에 있는 값만 사용하며, 따라서 키는 저장되지 않는다.


2) 딕셔너리 키의 자료형

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


>>> 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} # TypeError: unhashable type: 'list'

>>> x = {{"a": 10}: 100} # TypeError: unhashable type: 'dict'


3) 빈 딕셔너리 만들기

  • 빈 딕셔너리를 만들 때는 {}만 지정하거나 dict를 사용하면 된다.
  • 보통 {}를 주로 사용한다.


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

>>> y = dict()
>>> y
{}


4) dict로 딕셔너리 만들기

  • dict는 다음과 같이 키와 값을 연결하거나, 리스트, 튜플, 딕셔너리로 딕셔너리를 만들 때 사용한다.


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


  • 먼저 다음과 같이 dict에서 키=값 형식으로 딕셔너리를 만들 수 있는데, 이때는 키에 ''""를 사용하지 않아야 한다.


>>> lux1 = dict(health=490, mana=334, melee=550, armor=18.72)

>>> lux1
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


  • 두 번째 방법은 dict에서 zip 함수를 이용하는 방법인데, 다음과 같이 키가 들어있는 리스트(튜플)와 값이 들어있는 리스트(튜플)를 차례대로 zip에 넣은 뒤 다시 dict에 넣어주면 된다.


>>> lux2 = dict(zip(["health", "mana", "melee", "armor"], [490, 334, 550, 18.72]))

>>> lux2
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


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


>>> lux3 = dict([("health", 490), ("mana", 334), ("melee", 550), ("armor", 18.72)])

>>> lux3
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


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


>>> lux4 = dict({"health": 490, "mana": 334, "melee": 550, "armor": 18.72})

>>> lux4
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


4. 딕셔너리의 키에 접근하고 값 할당하기

  • 딕셔너리의 키에 접근할 때는 딕셔너리 뒤에 [](대괄호)를 사용하며 [] 안에 키를 지정해 주면 된다.


딕셔너리[]
>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux["health"]
490
>>> lux["armor"]
18.72


딕셔너리에 키를 지정하지 않으면?

  • 딕셔너리에 키를 지정하지 않은 상태는 해당 딕셔너리 전체를 뜻한다.
  • 따라서 다음과 같이 딕셔너리 lux를 출력하면 {}를 포함하여 딕셔너리 전체가 출력된다.


>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


1) 딕셔너리의 키에 값 할당하기

  • 딕셔너리는 []로 키에 접근한 뒤 값을 할당한다.


딕셔너리[] = 
>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux["health"] = 2037
>>> lux["mana"] = 1184

>>> lux
{'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72}


  • 딕셔너리에서 키의 값을 출력할 때와 마찬가지로 []에 키를 지정한 뒤 값을 할당하면 된다.


  • 특히, 다음과 같이 딕셔너리는 없는 키에 값을 할당하면 해당 키가 추가되고 값이 할당된다.


>>> lux["mana_regen"] = 3.28

>>> lux
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72, 'mana_regen': 3.28}


  • 만약 키에서 없는 값을 가져오려고 하면 에러가 발생한다.


>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> lux["attack_speed"] # KeyError: 'attack_speed'


2) 딕셔너리에 키가 있는지 확인하기

  • 딕셔너리에서 키가 있는지 확인하고 싶다면 in 연산자를 사용하면 된다.


 in 딕셔너리
>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> "health" in lux
True
>>> "attack_speed" in lux
False


  • 반대로 in 앞에 not을 붙이면 특정 키가 없는지 확인한다.


 not in 딕셔너리
>>> "attack_speed" not in lux
True
>>> "health" not in lux
False


해시(Hash)

  • 딕셔너리는 해시 기법을 이용해서 데이터를 저장한다.
  • 보통 딕셔너리와 같은 키-값 형태의 자료형을 해시, 해시 맵, 해시테이블 등으로 부르기도 한다.


3) 딕셔너리의 키 개수 구하기

  • 딕셔너리를 사용하다 보면 딕셔너리의 키 개수(길이)를 구할 필요가 있다.


  • 다음과 같이 키의 개수는 len 함수를 사용하여 구하는데, 키와 값은 1:1 관계이므로 키의 개수는 곧 값의 개수가 된다.


len(딕셔너리)
>>> lux = {"health": 490, "mana": 334, "melee": 550, "armor": 18.72}

>>> len(lux)
4
>>> len({"health": 490, "mana": 334, "melee": 550, "armor": 18.72})
4

References