반응형
딕셔너리란 무엇인가?
파이썬의 딕셔너리(Dictionary)는 실생활의 사전과 같은 개념입니다. 영어 사전에서 'apple'이라는 단어를 찾으면 '사과'라는 뜻을 얻는 것처럼, 파이썬 딕셔너리에서는 '키(Key)'를 통해 '값(Value)'을 찾을 수 있습니다.
딕셔너리는 다른 프로그래밍 언어에서 '해시맵(HashMap)', '연관배열(Associative Array)' 등으로 불리기도 합니다.
딕셔너리의 핵심 특징
특징 설명 예시
키-값 쌍 | 각 데이터는 키와 값의 조합으로 저장 | 'name': '김철수' |
순서 없음 | 데이터 저장 순서가 중요하지 않음 | 삽입 순서와 출력 순서가 다를 수 있음 |
키의 유일성 | 같은 키는 중복될 수 없음 | 'age' 키는 딕셔너리에 하나만 존재 |
빠른 검색 | 키를 통한 직접 접근으로 빠른 데이터 검색 | O(1) 시간 복잡도 |
딕셔너리 생성하기
기본 생성 방법
python
# 빈 딕셔너리 생성
empty_dict = {}
print(empty_dict) # {}
# 기본 딕셔너리 생성
student = {'name': '이영희', 'age': 20, 'major': '컴퓨터과학'}
print(student) # {'name': '이영희', 'age': 20, 'major': '컴퓨터과학'}
다양한 데이터 타입을 값으로 사용하기
python
# 다양한 데이터 타입을 값으로 사용
mixed_dict = {
'name': '박민수', # 문자열
'age': 25, # 정수
'height': 175.5, # 실수
'hobbies': ['독서', '영화감상', '게임'], # 리스트
'is_student': True, # 불린
'address': { # 중첩 딕셔너리
'city': '서울',
'district': '강남구'
}
}
print(mixed_dict)
다양한 키 타입 사용하기
python
# 정수를 키로 사용
score_dict = {1: '우수', 2: '보통', 3: '미흡'}
print(score_dict[1]) # 우수
# 튜플을 키로 사용 (불변 객체만 키로 사용 가능)
coordinate_dict = {(0, 0): '원점', (1, 1): '대각선', (2, 3): '임의점'}
print(coordinate_dict[(0, 0)]) # 원점
딕셔너리 데이터 추가 및 수정
새로운 키-값 쌍 추가하기
python
# 기본 딕셔너리
person = {'name': '홍길동'}
print("초기 상태:", person)
# 새로운 데이터 추가
person['age'] = 30
person['job'] = '개발자'
person['skills'] = ['Python', 'JavaScript', 'Java']
print("데이터 추가 후:", person)
# {'name': '홍길동', 'age': 30, 'job': '개발자', 'skills': ['Python', 'JavaScript', 'Java']}
기존 값 수정하기
python
# 기존 값 수정
person['age'] = 31 # 나이 수정
person['skills'].append('React') # 리스트에 새 항목 추가
print("수정 후:", person)
반응형
딕셔너리 데이터 삭제하기
del 키워드 사용하기
python
# 삭제 예제용 딕셔너리
game_stats = {
'player': '게이머123',
'level': 45,
'score': 95000,
'items': ['검', '방패', '포션'],
'location': '던전'
}
print("삭제 전:", game_stats)
# 특정 키-값 쌍 삭제
del game_stats['location']
print("location 삭제 후:", game_stats)
# 리스트 값의 특정 요소 삭제
del game_stats['items'][0] # '검' 삭제
print("아이템 삭제 후:", game_stats)
딕셔너리 값 조회하기
대괄호 표기법 vs get() 메서드
python
# 테스트용 딕셔너리
user_info = {
'username': 'user123',
'email': 'user@example.com',
'is_active': True
}
# 대괄호 표기법으로 값 조회
print("사용자명:", user_info['username'])
print("이메일:", user_info['email'])
# get() 메서드로 값 조회
print("사용자명:", user_info.get('username'))
print("전화번호:", user_info.get('phone')) # None 반환 (키가 없음)
print("전화번호:", user_info.get('phone', '등록되지 않음')) # 기본값 설정
# 존재하지 않는 키에 대한 오류 처리 예제
try:
print(user_info['phone']) # KeyError 발생
except KeyError:
print("해당 키가 존재하지 않습니다.")
딕셔너리 사용 시 주의사항
키의 중복과 데이터 타입 제한
python
# 키 중복 시 마지막 값만 유지됨
duplicate_keys = {'name': '첫번째', 'age': 20, 'name': '두번째'}
print(duplicate_keys) # {'name': '두번째', 'age': 20}
# 변경 가능한 객체는 키로 사용 불가
try:
invalid_dict = {[1, 2, 3]: 'value'} # 리스트는 키로 사용 불가
except TypeError as e:
print("오류:", e)
# 튜플은 키로 사용 가능 (불변 객체)
valid_dict = {(1, 2, 3): 'tuple_key'}
print(valid_dict) # {(1, 2, 3): 'tuple_key'}
딕셔너리 주요 메서드들
keys(), values(), items() 메서드
python
# 예제용 딕셔너리
restaurant = {
'name': '맛있는집',
'cuisine': '한식',
'rating': 4.5,
'price_range': '중간',
'location': '명동'
}
# 모든 키 조회
print("키 목록:", list(restaurant.keys()))
# ['name', 'cuisine', 'rating', 'price_range', 'location']
# 모든 값 조회
print("값 목록:", list(restaurant.values()))
# ['맛있는집', '한식', 4.5, '중간', '명동']
# 키-값 쌍 조회
print("키-값 쌍:")
for key, value in restaurant.items():
print(f"{key}: {value}")
clear() 메서드와 in 연산자
python
# 테스트용 딕셔너리 복사
test_dict = restaurant.copy()
# 특정 키의 존재 여부 확인
print("'name' 키 존재:", 'name' in test_dict) # True
print("'address' 키 존재:", 'address' in test_dict) # False
# 모든 데이터 삭제
test_dict.clear()
print("삭제 후:", test_dict) # {}
실전 예제: 학생 성적 관리 시스템
이제 딕셔너리를 활용한 실제적인 예제를 만들어보겠습니다.
python
# 학생 성적 관리 시스템
class StudentGradeManager:
def __init__(self):
# 학생 정보를 저장할 딕셔너리
self.students = {}
def add_student(self, student_id, name):
"""새 학생 추가"""
if student_id in self.students:
print(f"학번 {student_id}는 이미 존재합니다.")
return
self.students[student_id] = {
'name': name,
'subjects': {},
'average': 0.0
}
print(f"학생 {name}(학번: {student_id})이 추가되었습니다.")
def add_grade(self, student_id, subject, score):
"""성적 추가"""
if student_id not in self.students:
print(f"학번 {student_id}를 찾을 수 없습니다.")
return
# 성적 추가
self.students[student_id]['subjects'][subject] = score
# 평균 점수 계산
subjects = self.students[student_id]['subjects']
if subjects:
average = sum(subjects.values()) / len(subjects)
self.students[student_id]['average'] = round(average, 2)
print(f"{self.students[student_id]['name']}의 {subject} 성적({score}점)이 추가되었습니다.")
def get_student_info(self, student_id):
"""학생 정보 조회"""
student = self.students.get(student_id)
if not student:
print(f"학번 {student_id}를 찾을 수 없습니다.")
return
print(f"\n=== {student['name']}(학번: {student_id}) 정보 ===")
print(f"평균 점수: {student['average']}점")
print("과목별 성적:")
for subject, score in student['subjects'].items():
print(f" - {subject}: {score}점")
def get_top_students(self, count=3):
"""상위 학생 조회"""
if not self.students:
print("등록된 학생이 없습니다.")
return
# 평균 점수로 정렬
sorted_students = sorted(
self.students.items(),
key=lambda x: x[1]['average'],
reverse=True
)
print(f"\n=== 상위 {count}명 학생 ===")
for i, (student_id, info) in enumerate(sorted_students[:count], 1):
print(f"{i}위: {info['name']}(학번: {student_id}) - 평균 {info['average']}점")
def display_all_students(self):
"""전체 학생 목록 표시"""
if not self.students:
print("등록된 학생이 없습니다.")
return
print("\n=== 전체 학생 목록 ===")
for student_id, info in self.students.items():
print(f"학번: {student_id}, 이름: {info['name']}, 평균: {info['average']}점")
# 시스템 사용 예제
def main():
# 성적 관리 시스템 인스턴스 생성
manager = StudentGradeManager()
# 학생 추가
manager.add_student("2023001", "김철수")
manager.add_student("2023002", "이영희")
manager.add_student("2023003", "박민수")
# 성적 추가
# 김철수 성적
manager.add_grade("2023001", "수학", 95)
manager.add_grade("2023001", "영어", 88)
manager.add_grade("2023001", "과학", 92)
# 이영희 성적
manager.add_grade("2023002", "수학", 98)
manager.add_grade("2023002", "영어", 94)
manager.add_grade("2023002", "과학", 96)
# 박민수 성적
manager.add_grade("2023003", "수학", 82)
manager.add_grade("2023003", "영어", 79)
manager.add_grade("2023003", "과학", 85)
# 정보 조회
manager.get_student_info("2023001")
manager.get_student_info("2023002")
# 전체 학생 목록
manager.display_all_students()
# 상위 학생 조회
manager.get_top_students()
# 프로그램 실행
if __name__ == "__main__":
main()
실전 예제: 간단한 단어 암기 게임
딕셔너리를 활용한 또 다른 재미있는 예제입니다.
python
import random
class VocabularyGame:
def __init__(self):
# 영어 단어와 한국어 뜻을 저장하는 딕셔너리
self.vocabulary = {
'apple': '사과',
'banana': '바나나',
'computer': '컴퓨터',
'dictionary': '사전',
'elephant': '코끼리',
'fantastic': '환상적인',
'guitar': '기타',
'happiness': '행복',
'internet': '인터넷',
'journey': '여행',
'knowledge': '지식',
'language': '언어',
'mountain': '산',
'nature': '자연',
'ocean': '바다',
'python': '파이썬',
'question': '질문',
'rainbow': '무지개',
'sunshine': '햇빛',
'technology': '기술'
}
# 게임 통계
self.stats = {
'total_questions': 0,
'correct_answers': 0,
'wrong_answers': 0,
'accuracy': 0.0
}
def add_word(self, english, korean):
"""새 단어 추가"""
if english.lower() in self.vocabulary:
print(f"'{english}' 단어는 이미 존재합니다.")
return False
self.vocabulary[english.lower()] = korean
print(f"새 단어 '{english}: {korean}'이 추가되었습니다.")
return True
def remove_word(self, english):
"""단어 삭제"""
if english.lower() in self.vocabulary:
korean = self.vocabulary.pop(english.lower())
print(f"단어 '{english}: {korean}'이 삭제되었습니다.")
return True
else:
print(f"'{english}' 단어를 찾을 수 없습니다.")
return False
def quiz_mode(self, num_questions=5):
"""퀴즈 모드"""
if len(self.vocabulary) < num_questions:
num_questions = len(self.vocabulary)
# 랜덤하게 단어 선택
selected_words = random.sample(list(self.vocabulary.items()), num_questions)
print(f"\n=== 단어 퀴즈 시작! ({num_questions}문제) ===")
print("영어 단어의 한국어 뜻을 입력하세요.")
print("종료하려면 'quit'를 입력하세요.\n")
correct = 0
for i, (english, korean) in enumerate(selected_words, 1):
print(f"문제 {i}: {english}")
user_answer = input("답: ").strip()
if user_answer.lower() == 'quit':
print("퀴즈를 종료합니다.")
break
if user_answer == korean:
print("정답입니다! ✓")
correct += 1
self.stats['correct_answers'] += 1
else:
print(f"틀렸습니다. 정답: {korean} ✗")
self.stats['wrong_answers'] += 1
self.stats['total_questions'] += 1
print("-" * 30)
# 결과 출력
if self.stats['total_questions'] > 0:
accuracy = (correct / (i if 'i' in locals() else num_questions)) * 100
print(f"\n이번 퀴즈 결과: {correct}/{i if 'i' in locals() else num_questions}문제 정답 ({accuracy:.1f}%)")
self.update_stats()
def update_stats(self):
"""통계 업데이트"""
if self.stats['total_questions'] > 0:
self.stats['accuracy'] = (self.stats['correct_answers'] / self.stats['total_questions']) * 100
def show_stats(self):
"""통계 표시"""
print("\n=== 게임 통계 ===")
print(f"총 문제 수: {self.stats['total_questions']}")
print(f"정답 수: {self.stats['correct_answers']}")
print(f"오답 수: {self.stats['wrong_answers']}")
print(f"정답률: {self.stats['accuracy']:.1f}%")
def show_vocabulary(self):
"""전체 단어장 표시"""
print("\n=== 전체 단어장 ===")
for english, korean in sorted(self.vocabulary.items()):
print(f"{english} : {korean}")
print(f"\n총 {len(self.vocabulary)}개의 단어가 있습니다.")
def search_word(self, word):
"""단어 검색"""
word = word.lower()
if word in self.vocabulary:
print(f"{word} : {self.vocabulary[word]}")
else:
print(f"'{word}' 단어를 찾을 수 없습니다.")
# 비슷한 단어 제안
suggestions = [w for w in self.vocabulary.keys() if word in w or w in word]
if suggestions:
print("비슷한 단어들:")
for suggestion in suggestions[:3]: # 최대 3개까지
print(f" - {suggestion} : {self.vocabulary[suggestion]}")
def run_vocabulary_game():
"""게임 실행 함수"""
game = VocabularyGame()
while True:
print("\n=== 영어 단어 암기 게임 ===")
print("1. 퀴즈 시작")
print("2. 단어장 보기")
print("3. 단어 검색")
print("4. 단어 추가")
print("5. 단어 삭제")
print("6. 통계 보기")
print("7. 종료")
choice = input("\n선택하세요 (1-7): ").strip()
if choice == '1':
try:
num = int(input("몇 문제를 풀까요? (기본값: 5): ") or "5")
game.quiz_mode(num)
except ValueError:
print("올바른 숫자를 입력하세요.")
elif choice == '2':
game.show_vocabulary()
elif choice == '3':
word = input("검색할 단어를 입력하세요: ").strip()
if word:
game.search_word(word)
elif choice == '4':
english = input("영어 단어: ").strip()
korean = input("한국어 뜻: ").strip()
if english and korean:
game.add_word(english, korean)
elif choice == '5':
english = input("삭제할 영어 단어: ").strip()
if english:
game.remove_word(english)
elif choice == '6':
game.show_stats()
elif choice == '7':
print("게임을 종료합니다. 공부하느라 수고하셨습니다!")
break
else:
print("올바른 번호를 선택하세요.")
# 게임 실행
if __name__ == "__main__":
run_vocabulary_game()
딕셔너리 활용 팁
1. 딕셔너리 컴프리헨션
python
# 리스트에서 딕셔너리 생성
numbers = [1, 2, 3, 4, 5]
squared_dict = {num: num**2 for num in numbers}
print(squared_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 조건부 딕셔너리 컴프리헨션
even_squared = {num: num**2 for num in numbers if num % 2 == 0}
print(even_squared) # {2: 4, 4: 16}
2. 딕셔너리 병합
python
# 두 딕셔너리 병합 (Python 3.9+)
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# update() 메서드 사용
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
3. 중첩 딕셔너리 활용
python
# 중첩 딕셔너리로 복잡한 데이터 구조 표현
company = {
'employees': {
'dev_team': {
'manager': '김개발',
'members': ['이코딩', '박프로그래밍', '최알고리즘']
},
'design_team': {
'manager': '윤디자인',
'members': ['한그래픽', '조UI']
}
},
'projects': {
'project_a': {
'status': '진행중',
'deadline': '2024-12-31',
'team': 'dev_team'
}
}
}
# 중첩 딕셔너리 접근
print(company['employees']['dev_team']['manager']) # 김개발
마무리
딕셔너리는 파이썬에서 가장 유용하고 강력한 자료구조 중 하나입니다. 키-값 쌍으로 데이터를 저장하고 빠르게 검색할 수 있어서 다양한 프로그래밍 상황에서 활용됩니다.
딕셔너리 사용 시 기억할 점들
- 키는 불변 객체만 사용 가능: 문자열, 숫자, 튜플은 가능하지만 리스트는 불가능
- 키는 중복될 수 없음: 같은 키가 있으면 마지막 값으로 덮어쓰기됨
- get() 메서드 활용: 존재하지 않는 키에 안전하게 접근할 때 유용
- in 연산자: 키의 존재 여부를 확인할 때 사용
딕셔너리를 마스터하면 파이썬 프로그래밍에서 데이터를 효율적으로 관리하고 처리할 수 있습니다. 위의 예제들을 직접 실행해보면서 딕셔너리의 다양한 기능들을 익혀보세요!
반응형
'파이썬' 카테고리의 다른 글
7. 파이썬 불린(Boolean) 자료형에 대해서 공부하기 (0) | 2025.05.26 |
---|---|
6. 파이썬 집합(SET) 자료형. 여러 예제로 깊게 이해하기. (0) | 2025.05.25 |
4. 파이썬 튜플 기초부터 고급 활용까지 (0) | 2025.05.23 |
3. 예제와 함께하는 초보의 파이썬 리스트 완전 정복 가이드 (1) | 2025.05.23 |
2. 예제로 공부하는 파이썬 문자열 완전 정복 가이드 | 한번에 끝내는 문자열. (0) | 2025.05.23 |