Run The Bridge

5부 딕셔너리(dict) 본문

Python/나의 첫 파이썬

5부 딕셔너리(dict)

anfrhrl5555 2021. 9. 21. 23:23
728x90
반응형

0. 들어가기에 앞서

이번에는 딕셔너리에 들어있는 정보에 어떻게 접근하고 수정하는지 배운다.

딕셔너리에는 정보를 거의 무한히 저장할 수 있으므로 딕셔너리에 들어 있는 데이터를 루프로 처리하는 방법도 배우고,

딕셔너리 안에 리스트를, 리스트 안에 딕셔너리를, 딕셔너리 안에 다른 딕셔너리를 중첩하는 방법도 배운다.

이번에도 포기하지 말고 앞으로 가즈아!!


1. 단순한 딕셔너리

게임에서 어떤 정보를 저장할 때는 다음과 같은 딕셔너리를 쓸 수 있다.

alien_0 = {'color': 'green', 'points': 5}

print(alien_0['color'])
print(alien_0['points'])
green
5

이 딕셔너리는 alien_0의 외계인의 색깔과 점수를 저장한다. 마지막 두 행은 alien_0 정보에 접근해 정보를 출력할 수 있다.


2. 딕셔너리 값에 접근하기

python에서 딕셔너리란 키-값 쌍(key-value pair)의 묶음으로 이루어져 있다.

 

각 키(key)는 값(value)과 연결되고, 키를 통해 그 키와 연결된 값에 접근한다.

 

키의 값은 숫자, 문자열, 리스트, 심지어 다른 딕셔너리도 가능하다.

 

python에서 딕셔너리는 다음과 같이 키-값 쌍을 중괄호'{}'로 감싼 형태다.

alien_0 = {'color': 'green', 'points': 5}

 

키는 콜론(:)을 통해 값과 연결하고, 각 키-값 쌍은 콤마로 구분한다.

 

딕셔너리에는 키-값 쌍을 원하는 만큼 저장할 수 있다.

alien_0 = {'color': 'green'}

print(alien_0['color'])

이 코드는 alien_0 딕셔너리에는 'color' 키에 해당하는 값을 반환한다.

green

 

alien_0의 색깔이나 점수 값 어느 쪽이든 접근할 수 있다. player가 alien_0을 격추하면 다음과 같은 코드로 player가 얻은 점수를 계산할 수 있다.

alien_0 = {'color': 'green', 'points': 5}

new_points = alien_0['points']
print(f"You just earned {new_points} points!")
You just earned 5 points!

3. 키 - 값 쌍 추가하기

이번에는 alien_0에 x, y좌표를 추가해본다. 이 외계인은 화면의 왼쪽 긑 상단에서 25px 아래에 있다고 한다.

 

화면 좌표는 보통 왼쪽 모서리에서 시작하므로, 다음과 같이 x = 0, y = 25로 정하면 원하는 위치에 놓을 수 있다.

alien_0 = {'color': 'green', 'points': 5}

print(alien_0)

alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}

딕셔너리에 값을 추가하는 것은 어렵지 않다.

 

딕셔너리 명을 지정해주고 사용자 지정의 key-value값을 정의해주면 쉽게 추가할 수 있다.

 

그리고 딕셔너리는 '{}'를 쓰지만, 딕셔너리를 호출하거나 추가할 때는 '[]'를 쓴다는 것을 알아야 한다.


4. 빈 딕셔너리로 시작하기

때로는 빈 딕셔너리로 시작해서 키-값 쌍을 추가하는 것이 편리할 수 있고, 그렇게 해야만 할 때도 있다.

 

빈 딕셔너리를 채우려면 먼저 빈 중괄호를 딕셔너리로 정의하고 키-값 쌍을 한 행에 하나씩 추가하면 된다.

 

alien_0 딕셔너리를 빈 상태로 시작해서 키-값 쌍을 채운 예제를 보자.

alien_0 = {}

alien_0['color'] = 'green'
alien_0['points'] = 5

print(alien_0)
{'color': 'green', 'points': 5}

빈 딕셔너리를 정의하고, 색깔과 점수를 추가했다. 

 

빈 딕셔너리는 일반적으로 사용자가 제공한 데이터를 딕셔너리에 저장하거나, 대량의 키-값 쌍을 자동으로 생성하는 코드에서 사용한다.


5. 딕셔너리 값 수정하기

딕셔너리에 들어있는 값을 수정하려면 딕셔너리 이름 다음에 대괄호로 감싼 키를 쓰고, 그 키와 연결할 새 값을 쓰면 된다.

 

예를 들어 위에 green을 yellow로 바꿔보자.

alien_0 = {'color': 'green'}
print(f"The alien is {alien_0['color']}")

alien_0['color'] = 'yellow'
print(f"The alien is {alien_0['color']}")
The alien is green
The alien is yellow

 

조금 더 나아가 서로 다른 속도로 움직이는 외계인들의 위치를 추적해보자.

외계인의 현재 속도를 값으로 저장하고, 이 값을 통해 외계인이 오른쪽으로 얼마나 이동하는지 판단할 수 있다.

alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}
print(f"Original position: {alien_0['x_position']}")

# 외계인을 오른쪽으로 움직입니다.
# 외계인의 현재 속도를 통해 얼마나 많이 움직일지 결정합니다.
if alien_0['speed'] == 'slow':
    x_increment = 1

elif alien_0['speed'] == 'medium':
    x_increment = 2

else:
    # This must be a fast alien
    x_increment = 3

alien_0['x_position'] = alien_0['x_position'] + x_increment

print(f"New position: {alien_0['x_position']}")
Original position: 0
New position: 2

먼저 alien_0의 속도를 medium으로 지정하고 if-elif-else문을 선언한다. 

각 선언에는 slow, medium, other를 정의하는데, speed가 slow이면 증가 값을 1로 변화하고, medium이면 증가 값을 2로 지정한다. 그리고 그 외는 증가 값을 3으로 지정한다.

 

그리고 마지막에 alien_0 ['x_position'] 에다가 x_increment를 더해주고 출력해주는 코드이다.

 

외계인의 속도를 빠르게 바꾸고 싶으면 다음 행을 추가하기만 하면 된다.

alien_0['speed'] = 'fast'

그러면 코드를 실행할 때, else문이 실행되어 증가 값이 무려 3이 된다!!


6. 키-값 쌍 제거하기

딕셔너리에 저장한 정보가 더는 필요치 않으면 del 문을 써서 키-값 쌍을 완전히 제거할 수 있다.

del문에서 필요한 것은 딕셔너리와 제거할 키 이름뿐입니다.

 

alien_0 딕셔너리에서 'points' 키와 그 값을 제거해보자.

alien_0 = {'color': 'green', 'points': 5}
print(alien_0)

del alien_0['points']
print(alien_0)
{'color': 'green', 'points': 5}
{'color': 'green'}

del alien_0 ['points']로 인해 alien_0에 'points' 키-값 쌍이 제거되었다.

 

여기서 한 가지 의문점이 들 수 있다.

 

왜 굳이 키를 불러서 제거해야 할까? value만으로 제거할 수는 없을까? 한 번 구글링 해보았다.

pop() method or the "del" keyword는 key를 지울 때 사용하지 value만으로 지울 수 없다.

 

한 가지 가정을 해보았는데, key값은 고유할 수 있지만, value값은 고유하지 않아서 따로 제거하는 것이 없는 거 같다.

 

그래서 같은 key-value 쌍을 만들어서 테스트해보았는데 print문은 뒤에 6을 출력했다.

alien_0 = {'color': 'green', 'points': 5, 'points':6}
print(alien_0)

alien_0['points']
print(alien_0)
{'color': 'green', 'points': 6}
{'color': 'green', 'points': 6}

 

혹시 몰라 순서를 바꿔보아도 똑같았다.

alien_0 = {'color': 'green', 'points': 6, 'points':5}
print(alien_0)

alien_0['points']
print(alien_0)
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5}

이것으로 보아 딕셔너리는 중복되는 key값이 있으면, 가장 후순위에 있는 value을 가진 다라는 것을 알 수 있다.


7. 비슷한 객체로 만든 딕셔너리

이번에는 딕셔너리에 여러 객체에 공통인 정보를 저장할 수 있다. 예를 들어 사람들에게 그들이 좋아하는 프로그래밍 언어를 묻는 투표를 한다고 합시다. 딕셔너리는 단순한 투표 결과를 저장할 때도 유용하다.

favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

딕셔너리를 정의할 때 여러 행이 필요하다면, 한 행에 한가지 key-value 쌍을 정의하면 된다.

 

다음과 같이 딕셔너리 이름 다음에 투표에 참여한 사람 이름을 쓰면 그들이 좋아하는 언어를 쉽게 알 수 있다.

favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

language = favorite_languages['sarah'].title()
print(f"Sarah's favorite language is {language}")
Sarah's favorite language is C

8. get()을 사용해 값에 접근하기

대괄호 안에 키를 쓰는 문법으로 딕셔너리에서 원하는 값을 가져오는 방식에는 잠재적 문제가 하나 있는데, 존재하지 않는 키에 접근하려 하면 error가 일어난다는 것이다.

alien_0 = {'color': 'green', 'speed': 'slow'}
print(alien_0['points'])

이러한 error에 대처하는 방법은 후에 10장에서 배우지만, 딕셔너리에 한해서 요청한 키가 존재하지 않을 때 기본값을 대신 반환하는 get() 메서드를 사용해서 문제를 피할 수 있다.

 

get() 메서드의 첫 번째 매개변수는 key입니다. 두 번째 매개변수는 option으로, key가 존재하지 않을 때 반환할 값을 쓸 수 있다.

alien_0 = {'color': 'green', 'speed': 'slow'}

point_value = alien_0.get('points', 'No point value assigned.')
print(point_value)

'points' key가 존재하면 그에 해당하는 값을 얻습니다. 존재하지 않으면 기본값을 얻습니다.

여기서는 points key가 존재하지 않지만, 다음과 같이 에러 말고 메시지를 받습니다.

No point value assigned.

 

get() 함수의 매개변수 구조(pycharm의 ctrl+Q 명령으로 볼 수 있다.)

존재하지 않는 키를 요청할 수도 있을 것 같다면, 대괄호 표기법 대신 get() 메서드를 쓰는 것도 나쁘지 않다. 좋다!

728x90
반응형

'Python > 나의 첫 파이썬' 카테고리의 다른 글

4부 if문  (0) 2021.09.15
3부 리스트 다루기 & 튜플(tuple)  (0) 2021.09.15
2부 리스트(list)  (0) 2021.09.15
1부 기초  (2) 2021.09.09
Comments