소개
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 프로그래머가 되기 위한 중요한 단계입니다. 이러한 개념들을 계속 연습하여 더 복잡하고 효율적인 애플리케이션을 구축해 나가시길 바랍니다.



