코딩도장_Unit 12. 딕셔너리 사용하기

김민주·2021년 12월 30일
0

AIFFEL_풀잎스쿨

목록 보기
4/23
post-thumbnail

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

딕셔너리는 값다마 이름을 붙여서 저장하는 방식이다.
즉, 사전(dictionary)에서 단어를 찾듯이 값을 가져올 수 있다고 하여 딕셔너리라고 부른다.

12.1 딕셔너리 만들기

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

  • 딕셔너리 = {키1:값1, 키2:값2}
>>> 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)라 부른다.)

12.1.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}

12.1.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}
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'

12.1.3 빈 딕셔너리 만들기

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

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

12.1.4 dict로 딕셔너리 만들기

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

  • 딕셔너리 = dict(키1=값1, 키2=값2)
    이때는 키에 작은따옴표('')나 큰따옴표("")를 사용하지 않는다. 키는 딕셔너리를 만들고 나면 문자열로 바뀐다.
>>> lux1 = dict(health=490, mana=334, melee=550, armor=18.72)  # 키=값 형식으로 딕셔너리를 만듦
>>> lux1
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
  • 딕셔너리 = dict(zip([키1, 키2], [값1, 값2]))
    키가 들어있는 리스트와 값이 들어있는 리스트를 차례대로 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}
  • 딕셔너리 = dict([(키1, 값1), (키2, 값2)])
    키와 값을 리스트가 아닌 튜플에 저장해서 zip에 넣어도 된다.
>>> lux3 = dict([('health', 490), ('mana', 334), ('melee', 550), ('armor', 18.72)])
# (키, 값) 형식의 튜플로 딕셔너리를 만듦
>>> lux3                                          
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72} 
  • 딕셔너리 = dict({키1:값1, 키2:값2})
    dict안에서 중괄호로 딕셔너리를 생성하는 방법
>>> lux4 = dict({'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72})     
# dict 안에서 중괄호로 딕셔너리를 만듦
>>> lux4                                           
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}

딕셔너리는 키를 통해서 값의 의미를 파악하기 쉽다.
따라서 특정 주제에 대한 연관된 값들을 모아둘 때 주로 사용한다.

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

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

  • 딕셔너리[키]
>>> 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}

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

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

  • 딕셔너리[키] = 값
>>> 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'

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

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

  • 키 in 딕셔너리
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> 'health' in lux
True
>>> 'attack_speed' in lux
False

딕셔너리에 특정 키가 있으면 True, 없으면 False가 출력된다.

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

  • 키 not in 딕셔너리
>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> 'health' in lux
True
>>> 'attack_speed' in lux
False

not in은 특정키가 없으면 True, 있으면 False가 출력된다.

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

12.2.3 딕셔너리의 키 개수 구하기

키의 개수는 len함수를 사용하여 구한다. (키와 값은 1:1 관계이므로 키의 개수 = 값의 개수이다.)

  • len(딕셔너리)
>>> 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

딕셔너리는 특정 주제에 대해 연관된 값을 저장할 때 사용한다는 점이 리스트, 튜플과의 큰 차이점이다.

12.3 연습문제 : 딕셔너리에 게임 캐릭터 능력치 저장하기

다음 소스 코드를 완성하여 게임 캐릭터의 체력(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이라는 변수에 딕셔너리 데이터가 들어있다.
딕셔너리에서 값을 출력하려면 딕셔너리 키를 지정하면 된다.

profile
안녕하세요 :-) 잘 부탁드립니다!

0개의 댓글