파이썬에서는 연관된 값을 묶어서 저장하는 용도로 딕셔너리라는 자료형을 제공한다.
딕셔너리는 값다마 이름을 붙여서 저장하는 방식이다.
즉, 사전(dictionary)에서 단어를 찾듯이 값을 가져올 수 있다고 하여 딕셔너리라고 부른다.
딕셔너리는 중괄호({}
)안에 키:값
형식으로 저장하며 각 키와 값은 콤마(,
)로 구분해준다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> lux
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
📎 참고) 에러
SyntaxError:
invalid syntax:
{ }
의 짝이 맞지 않을 때,키:값
형식에 맞지 않을 때, 키 문자열의' '
짝이 맞지 않을 때, 각키:값
을 구분할 때,
를 넣지 않아서 발생하는 구문 에러이다.
딕셔너리는 키를 먼저 지정하고 콜론(:
)을 붙여서 값을 표현한다. 특히 키에는 값을 하나만 지정(1:1대응) 가능하다.(키-값 쌍(key-value pair)라 부른다.)
>>> 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}
딕셔너리 키는 문자열 뿐만 아니라 정수, 실수, 불도 사용할 수 있으며 자료형을 섞어서 사용해도 된다.
값에는 리스트, 딕셔너리를 포함하여 모든 자료형을 사용할 수 있다.
>>> 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
를 사용하면 된다. (보통 { }
주로 사용)
>>> x = {}
>>> x
{}
>>> y = dict()
>>> y
{}
dict
는 다음과 같이 키와 값을 연결하거나, 리스트, 튜플, 딕셔너리로 딕셔너리를 만들 때 사용한다.
>>> lux1 = dict(health=490, mana=334, melee=550, armor=18.72) # 키=값 형식으로 딕셔너리를 만듦
>>> lux1
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
zip
에 넣은 뒤 다시dict
에 넣어주면 된다.>>> lux2 = dict(zip(['health', 'mana', 'melee', 'armor'], [490, 334, 550, 18.72]))
# zip 함수로 키 리스트와 값 리스트를 묶음
>>> lux2
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
zip
에 넣어도 된다. >>> 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})
# dict 안에서 중괄호로 딕셔너리를 만듦
>>> lux4
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
딕셔너리는 키를 통해서 값의 의미를 파악하기 쉽다.
따라서 특정 주제에 대한 연관된 값들을 모아둘 때 주로 사용한다.
딕셔너리의 키에 접근할 때는 딕셔너리 뒤에 대괄호([]
)를 사용하며 []
안에 키를 지정해주면 된다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> lux['health']
490
>>> lux['armor']
18.72
📎 참고) 딕셔너리에 키를 지정하지 않으면?
딕셔너리에 키를 지정하지 않은 상태는 해당 딕셔너리 전체를 뜻한다.>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72} >> lux # 딕셔너리에 키를 지정하지 않으면 딕셔너리 전체를 뜻함 {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
딕셔너리는 []
키로 키에 접근한 뒤 값을 할당한다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> lux['health'] = 2037 # 키 'health'의 값을 2037로 변경
>>> lux['mana'] = 1184 # 키 'mana'의 값을 1184로 변경
>>> lux
{'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72}
만약 딕셔너리 내 없는 키에 값을 할당하면 해당 키가 추가되면서 값이 할당된다.
>>> lux['mana_regen'] = 3.28 # 키 'mana_regen'을 추가하고 값 3.28 할당
>>> lux
{'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72, 'mana_regen': 3.28}
없는 키에서 값을 가져오라고 하면 에러(KeyError
)가 발생한다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> lux['attack_speed'] # lux에는 'attack_speed' 키가 없음
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
lux['attack_speed']
KeyError: 'attack_speed'
딕셔너리에 키가 있는지 확인하고 싶다면 in
연산자를 사용하면 된다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> 'health' in lux
True
>>> 'attack_speed' in lux
False
딕셔너리에 특정 키가 있으면 True
, 없으면 False
가 출력된다.
반대로 in
앞에 not
을 붙이면 특정 키가 없는지 확인한다.
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> 'health' in lux
True
>>> 'attack_speed' in lux
False
not in
은 특정키가 없으면 True
, 있으면 False
가 출력된다.
📎 참고) 해시
딕셔너리는 해시(Hash) 기법을 사용해 데이터를 저장한다. 보통 딕셔너리와 같은 키-값 형태의 자료형을 해시, 해시 맵, 해시테이블 등으로 부르기도 한다.
키의 개수는 len
함수를 사용하여 구한다. (키와 값은 1:1 관계이므로 키의 개수 = 값의 개수
이다.)
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
# len에 딕셔너리 변수를 넣음
>>> len(lux)
4
# len에 딕셔너리를 그대로 넣음
>>> len({'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72})
4
딕셔너리는 특정 주제에 대해 연관된 값을 저장할 때 사용한다는 점이 리스트, 튜플과의 큰 차이점이다.
다음 소스 코드를 완성하여 게임 캐릭터의 체력(health)과 이동 속도(movement speed)가 출력되게 만드세요.
camille = {
'health': 575.6,
'health_regen': 1.7,
'mana': 338.8,
'mana_regen': 1.63,
'melee': 125,
'attack_damage': 60,
'attack_speed': 0.625,
'armor': 26,
'magic_resistance': 32.1,
'movement_speed': 340
}
print(camille['health'])
print(camille['movement_speed'])
# 실행결과
575.6
340
camille이라는 변수에 딕셔너리 데이터가 들어있다.
딕셔너리에서 값을 출력하려면 딕셔너리 키를 지정하면 된다.