바이브코더를 위한 파이썬 기초 6편: 딕셔너리, 키로 값 찾기와 KeyError
파이썬 딕셔너리에서 키로 값 찾기, 추가·수정, items() 반복. 없는 키의 KeyError와 get 기본값, JSON·API 응답을 다룰 때 AI 코드를 고치는 법을 정리했다.
AI에게 날씨 API나 설정 파일을 다루는 코드를 부탁하면 data["name"], config.get("timeout") 같은 줄이 잔뜩 나온다. 이름(키)으로 값을 찾는 딕셔너리다. 웹에서 주고받는 JSON 데이터도 {}로 된 객체라면 파이썬에서 딕셔너리로 읽힌다. 이 글은 '바이브코더를 위한 파이썬 기초' 10편 중 6편으로, 딕셔너리로 값을 읽고 추가·수정하는 법과 없는 키에서 나는 KeyError를 get으로 안전하게 다루는 법을 정리한다. 예제는 Python 3.15 기준으로 설명하며 Python 3.14.2에서 실행해 결과를 확인했다.
핵심 요약
- 딕셔너리는 중괄호
{}안에키: 값짝을 모아 둔 것이다. 번호 대신 이름으로 찾는다.- 같은 키에 다시 저장하면 새 항목이 생기지 않고 값이 바뀐다. 키는 중복되지 않는다.
- 없는 키를
[]로 찾으면KeyError가 난다. 없을 수도 있는 키는get(키, 기본값)으로 읽는다.items()로 키와 값을 함께 꺼내 반복할 수 있다.
딕셔너리는 전화번호부다
전화번호부에서는 이름(키)으로 번호(값)를 바로 찾는다. 5편의 리스트가 "몇 번째"로 찾는다면, 딕셔너리는 "무슨 이름"으로 찾는다.
사전에 비유하기도 하지만 한계가 있다. 사전은 없는 단어를 찾으면 "없음"을 알려 줄 뿐이지만, 딕셔너리는 없는 키를 []로 찾으면 오류를 내고 프로그램을 멈춘다. 이 차이가 이번 글의 핵심이다.
읽기, 추가하기, 반복하기
scores = {"국어": 90, "수학": 85}
scores["영어"] = 70
print(scores["수학"])
print(scores.get("과학", 0))
for subject, score in scores.items():
print(subject, score)
85
0
국어 90
수학 85
영어 70
| 코드 | 뜻 |
|---|---|
scores["수학"] | "수학" 키의 값 읽기. 키가 없으면 KeyError |
scores["영어"] = 70 | 키가 없으면 추가, 있으면 값 수정 |
scores.get("과학", 0) | 키가 없으면 오류 대신 기본값 0 |
scores.items() | 키와 값을 짝으로 꺼내기 |
for subject, score in scores.items():는 짝 하나를 꺼내 키는 subject, 값은 score에 붙인다. 딕셔너리를 훑는 AI 코드에서 가장 흔히 보는 모양이다.
흔한 함정: 없는 키는 None일까, KeyError일까
scores = {"국어": 90}
try:
print(scores["과학"])
except KeyError as e:
print("KeyError:", e)
KeyError: '과학'
None이 아니라 오류다. 오류 메시지에 찾으려던 키 이름('과학')이 그대로 나오니, 이 메시지를 보면 "그 키가 데이터에 없구나"로 읽으면 된다. 오타(예: "수학 "처럼 뒤에 공백)나 대소문자 차이("Name"과 "name")인 경우도 많다.
없을 수도 있는 키는 get으로 읽고 기본값을 준다. 반대로 반드시 있어야 하는 키라면 []로 읽어서 없을 때 바로 오류가 나게 두는 편이 낫다. 문제를 일찍 발견할 수 있기 때문이다.
바이브코딩에서 딕셔너리를 만나는 곳: JSON
API 응답이나 설정 파일에 쓰는 JSON을 파이썬의 json 모듈로 읽으면, {}로 된 JSON 객체는 딕셔너리가 되고 []로 된 배열은 리스트가 된다.
import json
data = json.loads('{"name": "민지", "age": 20}')
print(data["name"], data.get("email", "없음"))
민지 없음
AI가 짠 API 코드에서 KeyError가 났다면, 실제로 받은 데이터의 키가 AI가 예상한 키와 다른 경우가 많다. 이럴 때는 AI에게 코드만 다시 짜 달라고 하기보다 실제 응답을 먼저 보여 주는 게 빠르다.
- 받은 데이터를
print(data)로 출력하거나print(data.keys())로 키 목록을 본다. - 그 출력(개인정보·키·토큰은 지우고)을 AI에게 붙여 넣고 "실제 응답이 이렇게 생겼어. 여기에 맞게 고쳐 줘"라고 요청한다.
스스로 확인하기
d = {"a": 1}일 때d["b"]는? →KeyError.[]는 없는 키에 오류를 낸다.None을 골랐다면get과 헷갈린 것이다.- 이미
"c"키가 있는 딕셔너리에d["c"] = 3을 하면? → 기존 값이 3으로 바뀐다. 리스트의append와 달리 항목이 늘지 않는다.
직접 해 보기
친구 3명의 이름→전화번호 딕셔너리를 만들고, 이름을 넣으면 번호를, 없는 이름이면 "등록 안 됨"을 출력해 보자. 있는 이름과 없는 이름 모두 오류 없이 처리되면 성공이다. 막히면 get의 두 번째 인자를 확인한다.
phones = {"민지": "010-1111-2222", "지수": "010-3333-4444", "현우": "010-5555-6666"}
print(phones.get("지수", "등록 안 됨"))
print(phones.get("서연", "등록 안 됨"))
010-3333-4444
등록 안 됨
이전 편과 다음 편
- 이전 글: 5편: 리스트와 0부터 세는 인덱스
- 다음 글: 7편: 함수에서는 지금까지의 코드를 이름 붙여 재사용하는 함수와,
print와return의 차이를 다룬다.
시리즈 전체 목록은 10편 끝에 모아 두었다.