prices = {"apple": 0.50, "bread": 2.00}
# [] - 직접 인덱싱. 없으면 KeyError.
print(prices["apple"])
# .get() - 없으면 None(또는 기본값) 반환.
print(prices.get("milk")) # None
print(prices.get("milk", 0.00)) # 0.00
의도에 따라 고르세요:
키가 반드시 있어야 할 때는 []. 없다면 그건 버그고, 큰 소리로 에러가 나길 원할 거예요.
"없음"이 정상적인 경우일 때는 .get(). try/except 없이도 기본값을 다룰 수 있어요.
추가, 갱신, 삭제
키에 할당하면 키가 생기거나 갱신돼요:
prices = {"apple": 0.50, "bread": 2.00}
prices["milk"] = 1.20 # 새 키
prices["apple"] = 0.60 # 기존 키 덮어쓰기
print(prices)
del prices["bread"] # 키 제거; 없으면 KeyError
print(prices)
gone = prices.pop("apple") # 제거하고 반환; 기본값도 받을 수 있음
print("was:", gone, "now:", prices)
# 기본값과 함께 pop하면 없어도 예외가 안 남
prices.pop("missing", None)
user = {"name": "Rosa", "age": 30}
print("name" in user) # True
print("email" in user) # False
print("Rosa" in user) # False - 그건 값이지 키가 아님
값을 검사하려면 user.values()를 써야 해요:
print(30 in user.values())
딕셔너리 순회하는 법
반복할 수 있는 뷰가 세 가지 있어요:
scores = {"ada": 90, "rosa": 85, "malik": 78}
# 키 (기본)
for name in scores:
print(name)
# 값
for score in scores.values():
print(score)
# 둘 다 - 자주 쓰는 경우
for name, score in scores.items():
print(f"{name}: {score}")
대부분의 경우 .items()를 꺼내 쓰게 돼요 - 바로 언패킹돼서 쓸 수 있는 쌍을 주니까요.
현대 파이썬(3.7+)에서 순회 순서는 삽입 순서와 같아요. dict는 "마법의 주머니"가 아니에요 - a, b, c 순으로 넣으면 그 순서로 반복돼요. 언어 수준의 보장이라 믿어도 됩니다.
딕셔너리 정렬하는 법
딕셔너리는 삽입 순서를 유지하니까, dict를 "정렬한다"는 건 사실 원하는 순서로 키를 삽입한 새 dict를 만든다는 뜻이에요:
키 충돌이 있으면 오른쪽 dict의 값이 이겨요. .update()는 제자리 버전이고요. 예전 파이썬 버전에서는 {**defaults, **overrides}를 쓰세요.
setdefault 패턴
자주 있는 요구: "키가 있으면 그 값을 쓰고, 없으면 기본값을 설정한 뒤 쓴다."
counts = {}
for word in ["one", "two", "one", "three", "two", "one"]:
counts.setdefault(word, 0)
counts[word] += 1
print(counts)
아니면 collections.Counter를 쓰는 게 더 좋아요:
from collections import Counter
words = ["one", "two", "one", "three", "two", "one"]
print(Counter(words))
Counter는 개수 세기를 기본으로 하는 dict 하위 클래스예요. 등장 횟수를 세는 상황이라면 언제나 맞는 선택이에요.
딕셔너리 컴프리헨션
리스트 컴프리헨션과 같은 구조지만, dict를 만들어요:
numbers = [1, 2, 3, 4, 5]
squares = {n: n * n for n in numbers}
print(squares)
# dict 뒤집기 (키를 값으로, 값을 키로)
prices = {"apple": 0.50, "bread": 2.00}
lookup = {v: k for k, v in prices.items()}
print(lookup)
규칙은 리스트 컴프리헨션과 같은데, 중괄호 사이에 key: value가 들어간다는 게 달라요.
dict는 JSON의 쌍둥이
파이썬 dict는 JSON 객체와 거의 완벽하게 대응돼요. 서로 변환하는 게 한 번의 호출이면 끝납니다:
import json
data = {"name": "Rosa", "age": 30, "tags": ["python", "docs"]}
as_json = json.dumps(data)
print(as_json)
back = json.loads(as_json)
print(back)
그래서 웹 작업에서 dict가 어디에나 나타나요 - API 요청과 응답은 사실상 중간에 네트워크가 좀 낀 dict 조작이에요.