본문 바로가기
Python

13. 딕셔너리 - 이름표를 붙인 데이터

by 샤나엘 2026. 2. 22.
반응형

딕셔너리

13. 딕셔너리 - 이름표를 붙인 데이터

리스트는 인덱스(번호)로 접근했다. 하지만 "김철수의 점수"를 찾으려면 몇 번째인지 기억해야 한다. 딕셔너리를 쓰면 이름(키)으로 바로 찾을 수 있다.


딕셔너리란?

키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조다. 실생활의 사전(dictionary)과 같다 — 단어(키)로 뜻(값)을 찾는 것처럼.

# 리스트: 인덱스로 접근
scores_list = [85, 92, 78]
# scores_list[0]이 누구의 점수인지 모른다...

# 딕셔너리: 이름으로 접근!
scores = {
    "김철수": 85,
    "이영희": 92,
    "박민수": 78
}
print(scores["이영희"])   # 92

 

딕셔너리의 구조


딕셔너리 만들기

# 기본 생성
person = {
    "name": "김철수",
    "age": 25,
    "city": "서울"
}

# 빈 딕셔너리
empty = {}

# dict() 함수
user = dict(name="이영희", age=30, city="부산")
print(user)   # {'name': '이영희', 'age': 30, 'city': '부산'}

딕셔너리의 특징

  • 키는 고유해야 한다 (중복 불가)
  • 는 변경 불가능한 타입만 가능 (문자열, 숫자, 튜플)
  • 은 아무 타입이나 가능 (리스트, 딕셔너리까지도!)
  • 순서가 보장된다 (Python 3.7+)

값 접근과 수정

접근

person = {"name": "김철수", "age": 25, "city": "서울"}

# 대괄호로 접근
print(person["name"])    # 김철수
print(person["age"])     # 25

# get() 메서드 - 없는 키도 안전하게 처리
print(person.get("name"))      # 김철수
print(person.get("phone"))     # None (에러 안 남)
print(person.get("phone", "없음"))   # 없음 (기본값 지정)

⚠️ 대괄호 vs get(): 없는 키를 []로 접근하면 에러(KeyError)가 발생하지만, get()은 None을 반환한다. 키가 없을 수 있다면 get()이 안전하다.

수정과 추가

person = {"name": "김철수", "age": 25}

# 수정: 기존 키에 새 값 대입
person["age"] = 26
print(person)   # {'name': '김철수', 'age': 26}

# 추가: 없는 키에 값 대입
person["city"] = "서울"
print(person)   # {'name': '김철수', 'age': 26, 'city': '서울'}

삭제

person = {"name": "김철수", "age": 25, "city": "서울"}

# del: 키로 삭제
del person["city"]
print(person)   # {'name': '김철수', 'age': 25}

# pop: 삭제하면서 값 반환
age = person.pop("age")
print(age)      # 25
print(person)   # {'name': '김철수'}

# clear: 전부 삭제
person.clear()
print(person)   # {}

딕셔너리 메서드

딕셔너리 주요 메서드

keys(), values(), items()

student = {"이름": "김철수", "나이": 25, "학과": "컴퓨터공학"}

# 키만
print(student.keys())     # dict_keys(['이름', '나이', '학과'])

# 값만
print(student.values())   # dict_values(['김철수', 25, '컴퓨터공학'])

# 키-값 쌍
print(student.items())    # dict_items([('이름', '김철수'), ('나이', 25), ('학과', '컴퓨터공학')])

update()

person = {"name": "김철수", "age": 25}
extra = {"city": "서울", "age": 26}

person.update(extra)
print(person)   # {'name': '김철수', 'age': 26, 'city': '서울'}
# age가 26으로 업데이트, city가 추가됨
메서드 기능
keys() 모든 반환
values() 모든 반환
items() 모든 키-값 쌍 반환 (튜플)
get(key, default) 안전하게 값 가져오기
update(dict2) 다른 딕셔너리 병합
pop(key) 키로 삭제 + 값 반환

딕셔너리와 반복문

person = {"이름": "김철수", "나이": 25, "직업": "개발자"}

# 키만 순회 (기본)
for key in person:
    print(key)

# 값만 순회
for value in person.values():
    print(value)

# 키-값 함께 순회 (가장 많이 씀!)
for key, value in person.items():
    print(f"{key}: {value}")

출력:

이름: 김철수
나이: 25
직업: 개발자

딕셔너리 활용 예제

단어 빈도수 세기

text = "사과 바나나 사과 포도 바나나 사과 딸기"
words = text.split()

counter = {}
for word in words:
    if word in counter:
        counter[word] += 1
    else:
        counter[word] = 1

print(counter)
# {'사과': 3, '바나나': 2, '포도': 1, '딸기': 1}

전화번호부

phone_book = {}

# 추가
phone_book["김철수"] = "010-1234-5678"
phone_book["이영희"] = "010-9876-5432"
phone_book["박민수"] = "010-1111-2222"

# 검색
name = "이영희"
if name in phone_book:
    print(f"{name}: {phone_book[name]}")
else:
    print(f"{name}을(를) 찾을 수 없습니다")

중첩 딕셔너리

students = {
    "김철수": {"나이": 20, "점수": {"국어": 85, "영어": 90}},
    "이영희": {"나이": 21, "점수": {"국어": 92, "영어": 88}},
}

# 이영희의 영어 점수
print(students["이영희"]["점수"]["영어"])   # 88

# 전체 출력
for name, info in students.items():
    scores = info["점수"]
    avg = sum(scores.values()) / len(scores)
    print(f"{name} (나이: {info['나이']}): 평균 {avg:.1f}점")

실전 예시: 투표 집계 프로그램

candidates = ["김철수", "이영희", "박민수"]
votes = {}

# 초기화
for name in candidates:
    votes[name] = 0

print("=" * 30)
print("    투표 프로그램")
print("=" * 30)
print(f"후보: {', '.join(candidates)}")
print("투표를 시작합니다! (q: 종료)\n")

while True:
    choice = input("투표할 후보: ")
    if choice == "q":
        break
    if choice in votes:
        votes[choice] += 1
        print(f"✅ {choice}에게 투표 완료!")
    else:
        print("❌ 없는 후보입니다.")

# 결과 출력
print("\n" + "=" * 30)
print("    투표 결과")
print("=" * 30)

total = sum(votes.values())
for name, count in votes.items():
    bar = "█" * count
    pct = (count / total * 100) if total > 0 else 0
    print(f"{name}: {bar} {count}표 ({pct:.1f}%)")

# 당선자
winner = max(votes, key=votes.get)
print(f"\n🏆 당선: {winner} ({votes[winner]}표)")

직접 해보기

문제 1. 학생 3명의 이름과 점수를 딕셔너리로 저장하고, 가장 높은 점수의 학생을 찾아보자.

# 결과: 이영희 (92점)

문제 2. 문자열에서 각 문자의 등장 횟수를 세어보자.

text = "hello world"
# 결과: {'h': 1, 'e': 1, 'l': 3, 'o': 2, ...}

문제 3. 두 딕셔너리를 합치되, 같은 키의 값은 더해보자.

a = {"사과": 3, "바나나": 2, "포도": 5}
b = {"바나나": 4, "포도": 1, "딸기": 7}
# 결과: {'사과': 3, '바나나': 6, '포도': 6, '딸기': 7}
정답 보기
# 문제 1
students = {"김철수": 85, "이영희": 92, "박민수": 78}
top_name = ""
top_score = 0
for name, score in students.items():
    if score > top_score:
        top_score = score
        top_name = name
print(f"{top_name} ({top_score}점)")
‍
# 문제 2
text = "hello world"
char_count = {}
for ch in text:
    if ch == " ":
        continue
    char_count[ch] = char_count.get(ch, 0) + 1
print(char_count)
‍
# 문제 3
a = {"사과": 3, "바나나": 2, "포도": 5}
b = {"바나나": 4, "포도": 1, "딸기": 7}
result = a.copy()
for key, value in b.items():
    result[key] = result.get(key, 0) + value
print(result)

오늘의 정리

항목 내용
딕셔너리 {키: 값} — 이름으로 데이터를 찾는 자료구조
접근 방법 d["키"] 또는 d.get("키", 기본값)
주요 메서드 keys(), values(), items(), get(), update(), pop()
반복문 for key, value in d.items(): 가장 많이 사용
핵심 키는 고유해야 하고, 값은 아무 타입이나 가능

다음 편 예고: 튜플과 세트 - 용도에 맞는 그릇 선택

리스트, 딕셔너리 외에도 파이썬에는 튜플(변경 불가 리스트)과 세트(중복 불가 집합)가 있다. 각각 언제 쓰면 좋은지 알아보자.


태그: 파이썬 Python 파이썬독학 딕셔너리 dictionary dict key value 자료구조 파이썬기초 IT교육

반응형

댓글