Python 딕셔너리

PythonBeginner
지금 연습하기

소개

Python 에서 딕셔너리 (dictionary) 는 key: value 쌍으로 이루어진 순서가 있는 (Python 3.7 부터) 컬렉션입니다. 딕셔너리는 데이터를 변경 가능하고 (mutable), 인덱싱 가능하며, 중복된 키를 허용하지 않는 방식으로 저장하는 데 사용됩니다. 딕셔너리의 주요 작업은 키를 사용하여 값을 저장하고, 주어진 키로 값을 추출하는 것입니다.

예를 들어, 고양이에 대한 정보를 저장하기 위해 딕셔너리를 생성할 수 있습니다:

## 딕셔너리: 키 - 값 쌍의 컬렉션
my_cat = {
    'size': 'fat',          ## key: 'size', value: 'fat'
    'color': 'gray',        ## key: 'color', value: 'gray'
    'disposition': 'loud'   ## key: 'disposition', value: 'loud'
}

이 실습 (lab) 에서는 딕셔너리를 생성하고, 데이터에 접근 및 수정하며, 딕셔너리를 반복 (iterate) 하고, 다양한 유틸리티 메서드를 사용하여 효과적으로 작업하는 방법을 배웁니다.

딕셔너리 데이터 접근 및 수정

이 단계에서는 딕셔너리를 생성하고, 새로운 키 - 값 쌍을 추가하고, 기존 항목을 업데이트하며, 서브스크립트 연산자 []를 사용하여 값을 검색하는 방법을 배웁니다.

[] 연산자를 사용하여 키에 값을 할당함으로써 딕셔너리 항목을 추가하거나 업데이트할 수 있습니다. 키가 이미 존재하는 경우 해당 값이 업데이트됩니다. 키가 존재하지 않는 경우 새로운 키 - 값 쌍이 추가됩니다.

참고: WebIDE(VS Code 와 유사) 사용이 익숙하지 않다면, 이 랩에서 먼저 학습하십시오.

코드를 작성할 파일을 생성하는 것부터 시작하겠습니다.

먼저, 왼쪽 파일 탐색기에서 ~/project 디렉토리에 있는 main.py 파일을 엽니다.

이제 main.py에 다음 코드를 추가합니다. 이 코드는 딕셔너리를 정의한 다음 새 키 - 값 쌍을 추가합니다.

## 서브스크립트 연산자를 사용하여 딕셔너리 항목 추가 또는 업데이트
my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
my_cat['age_years'] = 2  ## 새 키 - 값 쌍 추가
print(my_cat)

스크립트를 실행하려면 터미널을 열고 다음 명령을 실행합니다.

python3 main.py

콘솔에 업데이트된 딕셔너리가 출력되는 것을 볼 수 있습니다.

{'size': 'fat', 'color': 'gray', 'disposition': 'loud', 'age_years': 2}

또한 서브스크립트 연산자 [] 안에 키를 사용하여 값을 검색할 수도 있습니다. main.py 파일을 수정하여 'size' 키와 연결된 값에 접근하고 출력해 보겠습니다.

main.py의 내용을 다음 코드로 대체합니다.

my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
print(my_cat['size'])

스크립트를 다시 실행합니다.

python3 main.py

출력 결과는 'size' 키의 값이 됩니다.

fat

딕셔너리에 없는 키에 접근하려고 하면 Python 은 KeyError를 발생시킨다는 점에 유의해야 합니다. 이를 실제로 확인해 보겠습니다. main.py의 코드를 다음 코드로 대체합니다.

my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
print(my_cat['eye_color'])

스크립트를 실행합니다.

python3 main.py

키 'eye_color'가 my_cat 딕셔너리에 존재하지 않기 때문에 KeyError가 발생합니다.

Traceback (most recent call last):
  File "/home/labex/project/main.py", line 5, in <module>
    print(my_cat['eye_color'])
KeyError: 'eye_color'

확인을 위해 main.py를 새 키를 추가하고 전체 딕셔너리를 출력하는 첫 번째 예제로 되돌리십시오.

## 서브스크립트 연산자를 사용하여 딕셔너리 항목 추가 또는 업데이트
my_cat = {
 'size': 'fat',
 'color': 'gray',
 'disposition': 'loud',
}
my_cat['age_years'] = 2  ## 새 키 - 값 쌍 추가
print(my_cat)

딕셔너리 반복 처리

이 단계에서는 딕셔너리를 반복하는 다양한 방법을 탐색합니다. Python 은 딕셔너리의 키, 값 또는 둘 다를 반복하기 위한 여러 메서드를 제공합니다.

values()를 사용한 값 반복

values() 메서드는 딕셔너리 내의 모든 값 목록을 표시하는 뷰 객체 (view object) 를 반환합니다. 이 객체를 반복하여 각 값에 접근할 수 있습니다.

main.py 파일을 지우고 다음 코드를 추가합니다:

## .values() 메서드를 사용하여 딕셔너리 값 반복
pet = {'color': 'red', 'age': 42}
for value in pet.values():  ## 모든 값 반복
    print(value)

스크립트를 실행합니다:

python3 main.py

출력 결과는 각 값이 새 줄에 표시됩니다:

red
42

keys()를 사용한 키 반복

마찬가지로, keys() 메서드는 딕셔너리의 키를 포함하는 뷰 객체를 반환합니다. pet.keys()를 사용할 수도 있지만, 딕셔너리 자체를 직접 반복하는 것이 키를 반복하는 더 일반적이고 Pythonic 한 방법입니다.

main.py를 다음 코드로 업데이트합니다:

## 딕셔너리를 직접 반복하면 키를 반복하게 됩니다 (기본 동작)
pet = {'color': 'red', 'age': 42}
for key in pet:  ## for key in pet.keys() 와 동일
    print(key)

스크립트를 실행합니다:

python3 main.py

키가 출력되는 것을 볼 수 있습니다:

color
age

items()를 사용한 키 - 값 쌍 반복

반복 중에 키와 값을 모두 필요로 할 때 items() 메서드는 매우 유용합니다. 이 메서드는 각 항목이 (key, value) 튜플인 뷰 객체를 반환합니다.

items()를 사용하도록 main.py를 업데이트합니다:

## .items() 메서드를 사용하여 키 - 값 쌍 반복
pet = {'color': 'red', 'age': 42}
for key, value in pet.items():  ## 튜플을 key 와 value 로 언패킹
    print(f'Key: {key} Value: {value}')

여기서 튜플 언패킹 (for key, value in ...) 을 사용하여 각 반복에서 튜플의 첫 번째 요소를 key로, 두 번째 요소를 value로 할당하고 있습니다.

스크립트를 실행합니다:

python3 main.py

출력 결과는 각 키 - 값 쌍을 보여주는 형식화된 문자열이 됩니다:

Key: color Value: red
Key: age Value: 42

안전하게 항목 접근 및 추가하기

이 단계에서는 KeyError를 발생시키지 않고 안전하게 값을 검색하는 방법과 조건부로 항목을 추가하는 방법을 배웁니다.

get()을 사용한 안전한 접근

1 단계에서 보았듯이, []를 사용하여 존재하지 않는 키에 접근하려고 하면 KeyError가 발생합니다. get() 메서드는 키에 접근하는 더 안전한 방법을 제공합니다. 키가 존재하면 해당 값을 반환하지만, 존재하지 않으면 오류를 발생시키는 대신 None을 반환합니다.

main.py를 지우고 다음 코드를 추가합니다:

## .get() 메서드: 값을 안전하게 검색하며, 키가 존재하지 않으면 None 을 반환
wife = {'name': 'Rose', 'age': 33}

print(f'My wife name is {wife.get("name")}')
print(f'She is deeply in love with {wife.get("husband")}')

스크립트를 실행합니다:

python3 main.py

출력 결과는 'name'에 대한 값과 누락된 키 'husband'에 대해 None이 반환되었음을 보여줍니다:

My wife name is Rose
She is deeply in love with None

또한 get()의 두 번째 인수로 기본값 (default value) 을 제공할 수도 있습니다. 이 값은 키를 찾을 수 없을 때 반환됩니다.

main.py를 수정하여 기본값을 제공합니다:

wife = {'name': 'Rose', 'age': 33}

print(f'She is deeply in love with {wife.get("husband", "lover")}')

다시 실행합니다:

python3 main.py

이제 출력 결과는 사용자가 지정한 기본값을 사용합니다:

She is deeply in love with lover

setdefault()를 사용한 조건부 추가

setdefault() 메서드는 키가 아직 존재하지 않는 경우에만 키 - 값 쌍을 추가하는 간결한 방법을 제공합니다. 이 메서드는 키를 확인하고, 존재하면 해당 키의 값을 반환합니다. 존재하지 않으면 지정된 값으로 키를 삽입하고 그 값을 반환합니다.

setdefault()를 사용하도록 main.py를 업데이트합니다:

wife = {'name': 'Rose', 'age': 33}
wife.setdefault('has_hair', True) ## 'has_hair'는 존재하지 않으므로 추가됩니다.
wife.setdefault('name', 'Lily') ## 'name'은 존재하므로 딕셔너리는 변경되지 않습니다.
print(wife)

스크립트를 실행합니다:

python3 main.py

출력 결과는 'has_hair'가 추가되었지만 'name'의 값은 업데이트되지 않았음을 보여줍니다:

{'name': 'Rose', 'age': 33, 'has_hair': True}

딕셔너리에서 항목 제거하기

이 단계에서는 딕셔너리에서 항목을 제거하는 다양한 방법을 연습합니다.

pop()을 사용한 제거

pop() 메서드는 지정된 키를 가진 항목을 제거하고 그 값을 반환합니다. 기본값이 제공되지 않으면 키를 찾을 수 없을 때 KeyError를 발생시킵니다.

main.py를 지우고 pop()의 작동 방식을 확인하기 위해 다음 코드를 추가합니다:

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_value = wife.pop('age')
print(f"Removed value: {removed_value}")
print(wife)

스크립트를 실행합니다:

python3 main.py

출력 결과는 제거된 값과 제거 후의 딕셔너리를 보여줍니다:

Removed value: 33
{'name': 'Rose', 'hair': 'brown'}

popitem()을 사용한 제거

popitem() 메서드는 딕셔너리에서 마지막으로 삽입된 항목을 제거합니다 (Python 3.7 이상). 제거된 항목을 (key, value) 튜플로 반환합니다.

main.py를 수정하여 popitem()을 사용합니다:

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_item = wife.popitem()
print(f"Removed item: {removed_item}")
print(wife)

스크립트를 실행합니다:

python3 main.py

마지막 항목인 ('hair', 'brown')이 제거되고 출력됩니다:

Removed item: ('hair', 'brown')
{'name': 'Rose', 'age': 33}

del 키워드를 사용한 제거

del 키워드는 키를 사용하여 항목을 제거하는 데 사용할 수 있습니다. 제거된 항목의 값은 반환하지 않습니다.

main.py를 수정하여 del을 사용합니다:

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
del wife['age']
print(wife)

스크립트를 실행합니다:

python3 main.py

'age' 키가 없는 딕셔너리가 출력됩니다:

{'name': 'Rose', 'hair': 'brown'}

clear()를 사용한 모든 항목 제거

clear() 메서드는 딕셔너리의 모든 항목을 제거하여 비워둡니다.

main.py를 수정하여 clear()를 사용합니다:

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.clear()
print(wife)

스크립트를 실행합니다:

python3 main.py

출력 결과는 빈 딕셔너리입니다:

{}

확인을 위해, main.py가 'age' 키를 제거하기 위해 pop()을 사용하고 최종 딕셔너리를 출력하는지 확인하십시오.

wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.pop('age')
print(wife)

딕셔너리 유틸리티 작업

이 단계에서는 키와 값의 존재 여부 확인, 보기 좋게 출력 (pretty-printing), 딕셔너리 병합을 포함한 유용한 딕셔너리 유틸리티를 알아봅니다.

in을 사용한 키 및 값 확인

in 연산자를 사용하여 딕셔너리에 키가 존재하는지 확인할 수 있습니다.

main.py를 지우고 다음 코드를 추가합니다:

person = {'name': 'Rose', 'age': 33}

print(f"'name' in person: {'name' in person}")
print(f"'height' in person: {'height' in person}")

스크립트를 실행합니다:

python3 main.py

출력 결과는 존재하는 키에 대해서는 True를, 존재하지 않는 키에 대해서는 False를 보여줍니다:

'name' in person: True
'height' in person: False

또한 values() 메서드와 함께 in을 사용하여 딕셔너리에 값이 존재하는지 확인할 수도 있습니다.

main.py를 수정합니다:

person = {'name': 'Rose', 'age': 33}

print(f"'Rose' in person.values(): {'Rose' in person.values()}")
print(f"33 in person.values(): {33 in person.values()}")
print(f"'John' in person.values(): {'John' in person.values()}")

실행합니다:

python3 main.py

출력:

'Rose' in person.values(): True
33 in person.values(): True
'John' in person.values(): False

pprint를 사용한 보기 좋게 출력 (Pretty Printing)

딕셔너리가 클 경우 직접 출력하면 길고 읽기 어려운 한 줄로 나올 수 있습니다. pprint 모듈은 딕셔너리를 더 읽기 쉬운 방식으로 포맷팅하는 "보기 좋게 출력 (pretty-print)" 기능을 제공합니다.

main.py를 업데이트합니다:

import pprint

wife = {'name': 'Rose', 'age': 33, 'has_hair': True, 'hair_color': 'brown', 'height': 1.6, 'eye_color': 'brown'}
pprint.pprint(wife)

스크립트를 실행합니다:

python3 main.py

출력은 키가 알파벳순으로 정렬되어 깔끔하게 포맷팅됩니다:

{'age': 33,
 'eye_color': 'brown',
 'hair_color': 'brown',
 'has_hair': True,
 'height': 1.6,
 'name': 'Rose'}

딕셔너리 병합

딕셔너리 언패킹 연산자 ** (Python 3.5 이상에서 사용 가능) 를 사용하여 두 딕셔너리를 병합할 수 있습니다. 키가 중복되는 경우, 두 번째 딕셔너리의 값이 사용됩니다.

다음 코드로 main.py를 업데이트합니다:

dict_a = {'a': 1, 'b': 2}
dict_b = {'b': 3, 'c': 4}
dict_c = {**dict_a, **dict_b}
print(dict_c)

스크립트를 실행합니다:

python3 main.py

출력은 두 딕셔너리의 모든 항목을 포함하는 새 딕셔너리입니다. 키 'b'의 값은 dict_b에서 온 3이라는 점에 유의하십시오.

{'a': 1, 'b': 3, 'c': 4}

요약

Python 딕셔너리 (Dictionary) 에 대한 실습을 완료하신 것을 축하드립니다!

본 실습에서 여러분은 Python 의 가장 강력한 데이터 구조 중 하나를 다루는 기본적인 연산들을 학습했습니다. 다룬 내용은 다음과 같습니다:

  • 생성, 접근 및 수정: {}를 사용하여 딕셔너리를 생성하고, 대괄호 (subscript operator) []를 사용하여 데이터를 추가, 업데이트 및 검색하는 방법을 배웠습니다.
  • 반복 (Iteration): keys(), values(), items() 메서드를 사용하여 키, 값, 키 - 값 쌍을 반복 처리하는 방법을 배웠습니다.
  • 안전한 연산: get()을 사용하여 KeyError를 방지하고, setdefault()를 사용하여 조건부로 항목을 추가하는 방법을 배웠습니다.
  • 항목 제거: pop(), popitem(), del 키워드, 그리고 clear()를 사용하여 항목을 제거하는 방법을 배웠습니다.
  • 유틸리티 작업: in 연산자를 사용한 멤버십 확인, pprint를 사용한 출력 포맷팅, ** 언패킹 연산자를 사용한 딕셔너리 병합을 배웠습니다.

딕셔너리를 숙달하는 것은 능숙한 Python 프로그래머가 되기 위한 중요한 단계입니다. 이러한 개념들을 계속 연습하여 더 복잡하고 효율적인 애플리케이션을 구축해 나가시길 바랍니다.