딕셔너리 (Dictionaries)

2025. 3. 26. 02:07Programming Languages/Python

딕셔너리 (Dictionaries)

딕셔너리는 키(key)와 값(value)의 쌍으로 이루어진 자료구조입니다. 각 키는 유일해야 하며, 이를 통해 값을 빠르게 검색할 수 있습니다. 중괄호 {}를 사용하여 표현합니다.

딕셔너리 생성하기

# 빈 딕셔너리 생성
empty_dict = {}
empty_dict2 = dict()

# 값이 있는 딕셔너리 생성
student = {
    "name": "김철수",
    "age": 20,
    "major": "컴퓨터공학",
    "gpa": 3.8
}

# dict() 생성자로 딕셔너리 생성
person = dict(name="이영희", age=25, job="개발자")

# 리스트의 튜플 쌍으로 딕셔너리 생성
items = [("apple", 3), ("banana", 5), ("orange", 2)]
fruit_count = dict(items)
print(fruit_count)  # {'apple': 3, 'banana': 5, 'orange': 2}

딕셔너리 항목 접근 및 수정

student = {
    "name": "김철수",
    "age": 20,
    "major": "컴퓨터공학",
    "gpa": 3.8
}

# 키를 사용하여 값에 접근
print(student["name"])  # 김철수
print(student["major"])  # 컴퓨터공학

# get() 메서드로 접근 (키가 없을 때 오류 대신 기본값 반환)
print(student.get("age"))       # 20
print(student.get("address"))   # None (기본값)
print(student.get("address", "주소 정보 없음"))  # 주소 정보 없음 (지정된 기본값)

# 항목 수정
student["age"] = 21
print(student["age"])  # 21

# 새 항목 추가
student["address"] = "서울시 강남구"
print(student)  # 'address': '서울시 강남구' 항목 추가됨

# 항목 삭제
del student["major"]
print(student)  # 'major' 항목 삭제됨

# pop() 메서드로 항목 삭제 및 값 반환
gpa = student.pop("gpa")
print(gpa)       # 3.8
print(student)   # 'gpa' 항목 삭제됨

딕셔너리 키, 값, 항목 순회하기

student = {
    "name": "김철수",
    "age": 21,
    "address": "서울시 강남구",
    "courses": ["파이썬", "자료구조", "알고리즘"]
}

# 키 순회
print("== 키 목록 ==")
for key in student:
    print(key)

# keys() 메서드로 키 순회
print("\n== keys() 사용 ==")
for key in student.keys():
    print(key)

# 값 순회
print("\n== 값 목록 ==")
for value in student.values():
    print(value)

# 키-값 쌍 순회
print("\n== 키-값 쌍 ==")
for key, value in student.items():
    print(f"{key}: {value}")

# items() 메서드 사용
print("\n== items() 사용 ==")
for item in student.items():
    print(f"{item[0]}: {item[1]}")  # 각 item은 (key, value) 형태의 튜플

딕셔너리 메서드

딕셔너리에는 다양한 유용한 메서드가 있습니다.

# 기본 딕셔너리
student = {
    "name": "김철수",
    "age": 21,
    "major": "컴퓨터공학"
}

# 딕셔너리 복사
student_copy = student.copy()

# 딕셔너리 비우기
student_copy.clear()
print(student_copy)  # {}

# 여러 항목 업데이트
student.update({"gpa": 3.9, "age": 22, "phone": "010-1234-5678"})
print(student)  # 항목 추가 및 기존 항목 수정됨

# 기본값과 함께 가져오기 (수정 없음)
phone = student.get("phone", "연락처 없음")
email = student.get("email", "이메일 없음")
print(phone)  # 010-1234-5678
print(email)  # 이메일 없음

# setdefault(): 키가 없을 때만 기본값 설정 및 반환
email = student.setdefault("email", "student@example.com")
print(email)  # student@example.com (추가되고 반환됨)
print(student)  # 'email': 'student@example.com' 항목 추가됨

# 키가 있는 경우 setdefault()는 기존 값 반환
name = student.setdefault("name", "홍길동")
print(name)  # 김철수 (기존 값 반환, 수정되지 않음)

중첩 딕셔너리

딕셔너리는 다른 딕셔너리나 리스트 등을 포함할 수 있어 복잡한 데이터 구조를 표현할 수 있습니다.

# 학생 정보를 포함하는 복잡한 딕셔너리
university = {
    "name": "서울대학교",
    "departments": {
        "컴퓨터공학": {
            "professor": "이교수",
            "students": 120,
            "courses": ["프로그래밍기초", "자료구조", "알고리즘"]
        },
        "전자공학": {
            "professor": "김교수",
            "students": 130,
            "courses": ["회로이론", "전자기학", "디지털회로"]
        }
    },
    "founded": 1946,
    "location": "서울시 관악구"
}

# 중첩 딕셔너리 접근하기
print(university["name"])  # 서울대학교
print(university["departments"]["컴퓨터공학"]["professor"])  # 이교수
print(university["departments"]["전자공학"]["courses"][1])  # 전자기학

# 중첩 딕셔너리 수정하기
university["departments"]["컴퓨터공학"]["students"] += 5  # 학생 수 증가
university["departments"]["전자공학"]["courses"].append("반도체공학")  # 과목 추가

# 새 학과 추가
university["departments"]["기계공학"] = {
    "professor": "박교수",
    "students": 100,
    "courses": ["역학", "열역학", "기계설계"]
}

# 중첩 딕셔너리 순회하기
print("\n== 학과 정보 ==")
for dept_name, dept_info in university["departments"].items():
    print(f"\n{dept_name} 학과:")
    print(f"  교수: {dept_info['professor']}")
    print(f"  학생 수: {dept_info['students']}명")
    print(f"  개설 과목: {', '.join(dept_info['courses'])}")

딕셔너리 컴프리헨션 (Dictionary Comprehension)

리스트 컴프리헨션과 유사하게, 딕셔너리 컴프리헨션을 사용하여 간결하게 딕셔너리를 생성할 수 있습니다.

# 기본 문법: {key_expr: value_expr for item in iterable}

# 1부터 5까지의 숫자의 제곱을 매핑하는 딕셔너리
squares = {x: x**2 for x in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 문자열 리스트에서 길이를 매핑하는 딕셔너리
fruits = ["apple", "banana", "cherry", "date", "elderberry"]
fruit_lengths = {fruit: len(fruit) for fruit in fruits}
print(fruit_lengths)  # {'apple': 5, 'banana': 6, 'cherry': 6, 'date': 4, 'elderberry': 11}

# 조건부 딕셔너리 컴프리헨션
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares)  # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}

# 두 리스트를 결합하여 딕셔너리 생성
names = ["Alice", "Bob", "Charlie", "David"]
scores = [85, 92, 78, 95]
student_scores = {name: score for name, score in zip(names, scores)}
print(student_scores)  # {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 95}

# 기존 딕셔너리 변환
original = {"a": 1, "b": 2, "c": 3}
inverted = {value: key for key, value in original.items()}
print(inverted)  # {1: 'a', 2: 'b', 3: 'c'}