Topic 4: 딕셔너리 - 키-값 쌍의 데이터 관리 🗂️
🎯 학습 목표
딕셔너리의 구조와 특징을 이해하고, 키-값 쌍을 이용해 데이터를 효율적으로 저장, 조회, 관리하는 방법을 익힐 수 있습니다.
🗂️ 딕셔너리란?
일상생활의 사전
실제 사전을 생각해보세요:
- 단어(키): “사과”
- 뜻(값): “장미과의 과일”
프로그래밍의 딕셔너리도 마찬가지로 **키(Key)**와 **값(Value)**의 쌍으로 이루어져 있습니다.
# 사전 같은 구조
student = {
"이름": "김철수",
"나이": 20,
"전공": "컴퓨터공학"
}
딕셔너리의 특징
- 키-값 쌍: 각 데이터는 키와 값으로 구성
- 키의 유일성: 같은 키는 하나만 존재
- 빠른 조회: 키로 값을 즉시 찾을 수 있음
- 순서 보장: Python 3.7+ 부터 입력 순서 유지
🏗️ 딕셔너리 생성
기본 생성 방법
# 중괄호 사용
student = {
"name": "김철수",
"age": 20,
"major": "컴퓨터공학"
}
# 빈 딕셔너리
empty_dict = {}
# dict() 함수 사용
person = dict(name="이영희", age=25, job="개발자")
다양한 타입의 키와 값
# 다양한 타입 혼합
mixed_dict = {
"이름": "김철수", # 문자열 키
1: "첫 번째", # 숫자 키
(2, 3): "좌표", # 튜플 키
"점수": [90, 85, 92] # 리스트 값
}
🔍 딕셔너리 접근과 수정
값 조회
student = {
"name": "김철수",
"age": 20,
"major": "컴퓨터공학"
}
# 대괄호로 접근
print(student["name"]) # 김철수
print(student["age"]) # 20
# get() 메서드로 안전하게 접근
print(student.get("name")) # 김철수
print(student.get("phone", "없음")) # 없음 (기본값 반환)
값 수정과 추가
student = {
"name": "김철수",
"age": 20
}
# 기존 값 수정
student["age"] = 21
# 새로운 키-값 추가
student["major"] = "컴퓨터공학"
student["phone"] = "010-1234-5678"
print(student)
# {'name': '김철수', 'age': 21, 'major': '컴퓨터공학', 'phone': '010-1234-5678'}
값 삭제
student = {
"name": "김철수",
"age": 20,
"major": "컴퓨터공학"
}
# del 키워드로 삭제
del student["major"]
# pop() 메서드로 삭제 (값 반환)
age = student.pop("age")
print(f"삭제된 나이: {age}") # 삭제된 나이: 20
print(student) # {'name': '김철수'}
🛠️ 딕셔너리 메서드
주요 메서드들
student = {
"name": "김철수",
"age": 20,
"major": "컴퓨터공학"
}
# 모든 키 조회
print(student.keys()) # dict_keys(['name', 'age', 'major'])
# 모든 값 조회
print(student.values()) # dict_values(['김철수', 20, '컴퓨터공학'])
# 모든 키-값 쌍 조회
print(student.items()) # dict_items([('name', '김철수'), ('age', 20), ('major', '컴퓨터공학')])
# 키 존재 여부 확인
print("name" in student) # True
print("phone" in student) # False
딕셔너리 업데이트
student = {"name": "김철수", "age": 20}
additional_info = {"major": "컴퓨터공학", "phone": "010-1234-5678"}
# 다른 딕셔너리로 업데이트
student.update(additional_info)
print(student)
# {'name': '김철수', 'age': 20, 'major': '컴퓨터공학', 'phone': '010-1234-5678'}
🔄 딕셔너리 순회
키로 순회
scores = {
"수학": 90,
"영어": 85,
"과학": 92
}
# 키만 순회
for subject in scores:
print(f"{subject}: {scores[subject]}")
# 명시적으로 keys() 사용
for subject in scores.keys():
print(f"{subject}: {scores[subject]}")
값으로 순회
scores = {
"수학": 90,
"영어": 85,
"과학": 92
}
# 값만 순회
for score in scores.values():
print(f"점수: {score}")
키-값 쌍으로 순회
scores = {
"수학": 90,
"영어": 85,
"과학": 92
}
# 키-값 쌍 순회
for subject, score in scores.items():
print(f"{subject}: {score}점")
📊 실용적인 활용 예시
예시 1: 학생 성적 관리
# 학생별 성적 딕셔너리
student_scores = {
"김철수": 85,
"이영희": 92,
"박민수": 78,
"최지영": 96
}
print("📊 학생 성적:")
for name, score in student_scores.items():
print(f"{name}: {score}점")
# 성적 통계
scores = student_scores.values()
average = sum(scores) / len(scores)
highest = max(scores)
lowest = min(scores)
print(f"\n📈 성적 통계:")
print(f"평균: {average:.1f}점")
print(f"최고점: {highest}점")
print(f"최저점: {lowest}점")
예시 2: 단어 빈도 분석
text = "python is great python is fun python is powerful"
words = text.split()
# 단어 빈도 계산
word_count = {}
for word in words:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
# 또는 get() 메서드 사용
word_count = {}
for word in words:
word_count[word] = word_count.get(word, 0) + 1
# 결과 출력
print("📊 단어 빈도 분석:")
for word, count in word_count.items():
print(f"{word}: {count}번")
예시 3: 카페 메뉴 관리
# 카페 메뉴 (음료와 가격)
menu = {
"아메리카노": 4000,
"카페라떼": 4500,
"카푸치노": 5000,
"주스": 3500,
"케이크": 6000
}
print("☕ 카페 메뉴")
for drink, price in menu.items():
print(f"{drink}: {price:,}원")
# 가격 검색
item_name = "아메리카노"
if item_name in menu:
price = menu[item_name]
print(f"\n{item_name} 가격: {price:,}원")
else:
print(f"{item_name}는 메뉴에 없습니다.")
# 메뉴 개수
print(f"\n총 메뉴 개수: {len(menu)}개")
🔄 딕셔너리 조작 심화
딕셔너리 합치기
# 두 딕셔너리 합치기
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
# update() 메서드 사용
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# 새로운 딕셔너리 생성
dict3 = {"e": 5, "f": 6}
combined = {**dict1, **dict3}
print(combined) # {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
딕셔너리 값 변환
# 기존 딕셔너리
scores = {"수학": 80, "영어": 90, "과학": 85}
# 모든 점수에 5점 추가
for subject in scores:
scores[subject] += 5
print(scores) # {'수학': 85, '영어': 95, '과학': 90}
🎯 딕셔너리 안에 딕셔너리
학생 과목별 성적 관리
# 학생별 과목 성적
student_grades = {
"김철수": {"수학": 90, "영어": 85},
"이영희": {"수학": 95, "영어": 88},
"박민수": {"수학": 78, "영어": 92}
}
# 특정 학생의 성적 확인
student_name = "김철수"
print(f"{student_name}의 성적:")
for subject, score in student_grades[student_name].items():
print(f" {subject}: {score}점")
# 수학 점수만 확인
print(f"\n수학 성적:")
for name, grades in student_grades.items():
math_score = grades["수학"]
print(f"{name}: {math_score}점")
🚨 자주 발생하는 오류
오류 1: 존재하지 않는 키 접근
# ❌ 틀린 예
student = {"name": "김철수", "age": 20}
print(student["phone"]) # KeyError: 'phone'
# ✅ 올바른 예
student = {"name": "김철수", "age": 20}
phone = student.get("phone", "정보 없음")
print(phone) # 정보 없음
# 또는 in 연산자로 확인
if "phone" in student:
print(student["phone"])
else:
print("전화번호 정보가 없습니다.")
오류 2: 불변 객체가 아닌 키 사용
# ❌ 틀린 예
# my_dict = {[1, 2]: "리스트"} # TypeError: unhashable type: 'list'
# ✅ 올바른 예
my_dict = {(1, 2): "튜플"} # 튜플은 불변 객체이므로 키로 사용 가능
print(my_dict[(1, 2)]) # 튜플
💡 퀴즈: 딕셔너리 이해도 체크
Q1. 다음 코드의 출력 결과는?
d = {"a": 1, "b": 2}
d["c"] = 3
d["a"] = 10
print(len(d))
- 2
- 3
- 4
- 오류 발생
💡 정답 확인
정답: 2번 (3)
딕셔너리 d는 키 “a”, “b”, “c”를 가지므로 길이는 3입니다.
Q2. 딕셔너리에서 안전하게 값을 조회하는 방법은?
- dict[key]
- dict.get(key)
- dict.get(key, default)
- 2번과 3번 모두
💡 정답 확인
정답: 4번 (2번과 3번 모두)
get() 메서드는 키가 없을 때 KeyError를 발생시키지 않고, 기본값을 설정할 수도 있습니다.
Q3. 딕셔너리의 모든 키-값 쌍을 순회하는 방법은?
- for k, v in dict.items():
- for k in dict.keys():
- for v in dict.values():
- for item in dict:
💡 정답 확인
정답: 1번 (for k, v in dict.items():)
items() 메서드를 사용하면 키-값 쌍을 함께 순회할 수 있습니다.
✅ 딕셔너리 마스터 체크리스트
✅ 딕셔너리 마스터 체크리스트
🎉 Unit 4 완주!
딕셔너리까지 학습하면서 자료구조의 모든 기본기를 완성했습니다!
🏆 Unit 4에서 배운 내용
- 리스트: 순서가 있는 변경 가능한 데이터 모음
- 리스트 메서드: 데이터 추가, 삭제, 정렬, 검색
- 튜플: 순서가 있는 변경 불가능한 데이터 모음
- 딕셔너리: 키-값 쌍으로 관리하는 데이터 모음
🚀 이제 할 수 있는 것들
- 다양한 형태의 데이터를 적절한 자료구조로 관리
- 효율적인 데이터 저장과 조회
- 복잡한 데이터 구조를 설계하고 활용
- 실제 프로그램에서 자료구조를 적절히 선택하여 사용
축하합니다! 이제 파이썬의 핵심 자료구조를 모두 마스터했습니다! 🎊
이제 여러분은 다양한 데이터를 효율적으로 관리하고 조작할 수 있는 강력한 도구들을 갖추었습니다. 이 자료구조들을 조합하여 더 복잡하고 실용적인 프로그램을 만들어보세요!
Last updated on