파이썬 / / 2025. 5. 25. 00:37

5. 파이썬 딕셔너리 초보부터 중수까지 완벽한 예제로 공부하자.

반응형

파이썬-딕셔너리-초보부터-중수까지-예제로 공부하자

 

 

 

딕셔너리란 무엇인가?

파이썬의 딕셔너리(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 연산자: 키의 존재 여부를 확인할 때 사용

딕셔너리를 마스터하면 파이썬 프로그래밍에서 데이터를 효율적으로 관리하고 처리할 수 있습니다. 위의 예제들을 직접 실행해보면서 딕셔너리의 다양한 기능들을 익혀보세요!

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유