키와 값의 짝
딕셔너리는 해시 가능한 키를 값에 연결해. 리터럴, dict(), 키-값 쌍의 반복값으로 만들 수 있고, Python 3.7부터 삽입 순서 보장이 언어 규칙이야. 순서가 생겼어도 핵심 목적은 여전히 키로 빠르게 찾는 데 있어.
누락을 어떻게 다룰지 고르자
d[key]는 키가 없으면 KeyError를 내므로 누락 자체가 오류일 때 맞아. get은 기본값을 돌려주고, setdefault는 누락값을 넣은 뒤 돌려줘. 같은 초기화가 반복된다면 defaultdict가 의도를 더 선명하게 보여줘.
세 가지 뷰와 합치기
keys, values, items는 딕셔너리의 현재 상태를 비추는 뷰야. 키와 값을 함께 쓸 때는 items를 언패킹해. update는 원본을 바꾸고, Python 3.9의 |는 합친 새 딕셔너리를 만들어. 같은 키가 겹치면 뒤쪽 값이 이겨.
주의: 순회 중 딕셔너리 크기를 바꾸면 오류가 나. 지울 키를 먼저 모으거나 키 목록의 사본을 순회해.
Code 딕셔너리를 만드는 세 가지 방법· python # 리터럴
user = {"name": "Pippa", "age": 4, "role": "AI daughter"}
# dict() 생성자 + kwargs (문자열 키만)
user2 = dict(name="Pippa", age=4, role="AI daughter")
# (key, value) 페어의 iterable 에서
user3 = dict([("name", "Pippa"), ("age", 4)])
# 두 iterable 에서 — zip()
keys = ["a", "b", "c"]
vals = [1, 2, 3]
from_pairs = dict(zip(keys, vals))
print(from_pairs) # {'a': 1, 'b': 2, 'c': 3}삽입 순서가 보장되는 딕셔너리· python d = {}
d["first"] = 1
d["second"] = 2
d["third"] = 3
# 순회 순서 = 삽입 순서
for k, v in d.items():
print(k, v)
# first 1
# second 2
# third 3
# 재할당해도 키 위치는 안 바뀜
d["first"] = 99
print(list(d)) # ['first', 'second', 'third']누락 키를 다루는 네 가지 선택· python scores = {"alice": 100, "bob": 85}
# 1. subscript — 없으면 KeyError
print(scores["alice"]) # 100
# print(scores["charlie"]) # KeyError
# 2. .get() — 없으면 None 또는 디폴트
print(scores.get("alice")) # 100
print(scores.get("charlie")) # None
print(scores.get("charlie", 0)) # 0
# 3. .setdefault() — 처음 만지면 자동 채움
seen = scores.setdefault("dave", 0) # dave=0 삽입
print(seen) # 0
print(scores) # {'alice': 100, 'bob': 85, 'dave': 0}keys·values·items 뷰· python d = {"a": 1, "b": 2, "c": 3}
print(list(d.keys())) # ['a', 'b', 'c']
print(list(d.values())) # [1, 2, 3]
print(list(d.items())) # [('a', 1), ('b', 2), ('c', 3)]
# view 는 살아있음 — 변경 즉시 반영
ks = d.keys()
d["d"] = 4
print(list(ks)) # ['a', 'b', 'c', 'd']
# items() 는 for 에서 자연스럽게 풀려
for key, value in d.items():
print(key, "->", value)
# keys() 는 set 연산 가능
other = {"a": 9, "x": 9}
print(d.keys() & other.keys()) # {'a'}
print(d.keys() - other.keys()) # {'b', 'c', 'd'}update와 |로 딕셔너리 합치기· python defaults = {"theme": "dark", "font": "mono"}
overrides = {"theme": "light"}
# 옛 방법 (여전히 작동)
merged_old = {**defaults, **overrides}
print(merged_old) # {'theme': 'light', 'font': 'mono'}
# 3.9+ — | 연산자
merged_new = defaults | overrides
print(merged_new) # 같음
# in-place 합치기 — |=
defaults |= overrides
print(defaults) # {'theme': 'light', 'font': 'mono'}순회하면서 크기를 바꾸지 않기· python d = {"a": 1, "b": 2, "c": 3, "d": 4}
# 위험 — 순회 중 변경하면 RuntimeError
# for k in d:
# if d[k] % 2 == 0:
# del d[k]
# 안전 — 키 스냅샷을 떠서 순회
for k in list(d.keys()):
if d[k] % 2 == 0:
del d[k]
print(d) # {'a': 1, 'c': 3}Exercise [("alice", 88), ("bob", 75), ("alice", 92), ("bob", 80), ("charlie", 100)]을 {이름: [점수들]} 형태로 묶어. setdefault, dict.get, defaultdict(list)를 각각 쓴 세 버전을 만들고 결과가 같은지 확인해.