반응형

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교육
반응형
'Python' 카테고리의 다른 글
| 15. 컴프리헨션 - 파이썬다운 코드 작성법 (0) | 2026.02.22 |
|---|---|
| 14. 튜플과 세트 - 용도에 맞는 그릇 선택 (0) | 2026.02.22 |
| 12. 리스트 - 데이터를 줄 세우기 (0) | 2026.02.22 |
| 11. 실습: 숫자 맞추기 게임 만들기 (0) | 2026.02.21 |
| 10. 중첩 반복문 - 별 찍기로 연습하기 (0) | 2026.02.21 |
댓글