여기서는 "여러 값을 담는다"보다 이름이나 ID 같은 키로 바로 찾아야 하는지를 먼저 봅니다.
몇 번째 값인지보다 어떤 키의 값인지가 중요하면 list보다 dict가 먼저입니다.
숏컷 코드
scores = {"mina": 1200, "jin": 980}
score = scores.get("mina", 0)
scores.setdefault("sora", 0)
scores["sora"] += 50
for name, value in scores.items():
print(name, value)문법
기본형은 빈 dict, 리터럴, 필수 조회, 선택 조회, 순회, 누적까지 같이 보면 됩니다.
data = {}
data = {"name": "Mina", "score": 95}
value = data["name"]
value = data.get("level", 0)
for key, value in data.items():
...
data["count"] = data.get("count", 0) + 1
data.setdefault("tags", []).append("python")dict는 키로 값을 찾는 매핑이고, []와 get()은 "키가 반드시 있어야 하는가"에서 갈립니다.
조회 모델
키로 바로 찾는 문제면 dict가 먼저다
리스트는 값을 순서대로 담는 데 강하지만, 특정 이름이나 ID로 찾으려면 직접 순회해야 합니다. dict는 키를 통해 값을 바로 읽는 구조라서 조회 테이블, 설정값, 매핑 데이터에 잘 맞습니다.
user_map = {1: "Mina", 2: "Jin"}
name = user_map[2]즉 "키 -> 값" 관계가 분명하면 Python에서는 dict가 기본 선택입니다.
접근 방식
키가 반드시 있으면 [], 없을 수도 있으면 get()을 쓴다
이 카드에서 가장 자주 다시 찾는 질문은 이 부분입니다.
- 키가 반드시 있어야 한다:
data[key] - 키가 없을 수도 있다:
data.get(key, default)
config = {"timeout": 3}
timeout = config["timeout"]
retry = config.get("retry", 0)[]는 키가 없으면 KeyError를 내기 때문에, "필수 값이 빠졌음"을 빨리 드러내고 싶을 때 좋습니다.
반대로 기본값으로 흘려보내도 되는 선택 값은 get()이 더 자연스럽습니다.
config = {"timeout": 3}
timeout = config["timeout"] # 필수 키
retry = config.get("retry", 0) # 선택 키상태 누적
집계와 그룹화는 dict가 가장 많이 쓰인다
dict는 중간 결과를 키별로 쌓는 구조에 아주 잘 맞습니다. 특히 카운팅, 그룹화, 최신 상태 저장 같은 작업에서 자주 나옵니다.
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
grouped = {}
for user in users:
country = user["country"]
grouped.setdefault(country, []).append(user["name"])즉 dict는 조회 테이블일 뿐 아니라 "키별 상태 저장소"로도 자주 읽힙니다.
순회와 경계
순회는 items()가 기본이고, 단순 카운팅은 Counter와 경계를 본다
dict를 돌 때는 무엇이 필요한지에 따라 읽는 방식이 달라집니다.
- 키만 필요함:
data.keys() - 값만 필요함:
data.values() - 키와 값이 둘 다 필요함:
data.items()
for name, score in scores.items():
print(name, score)대부분의 실전 코드는 items()를 가장 많이 보게 됩니다.
for key in scores.keys():
print(key)
for value in scores.values():
print(value)직접 누적하는 dict 코드가 틀린 것은 아니지만, 빈도수만 세는 문제라면 collections.Counter가 더 짧고 의도가 분명합니다.
그래서 dict를 쓸지 표준 도구를 쓸지도 같이 판단하면 좋습니다.
from collections import Counter
counts = Counter(words)키별 상태를 직접 관리해야 하면 dict, 단순 빈도수 집계면 Counter가 더 직접적입니다.
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
from collections import Counter
counter_counts = Counter(words)즉 "키별 상태를 내가 직접 통제해야 하나"를 먼저 보면 됩니다. 단순 카운팅만 목적이면 Counter가 더 짧고 실수도 적습니다.
주의할 점
가변 객체는 딕셔너리 키로 쓸 수 없습니다. 키는 해시 가능하고 값이 변하지 않는 형태여야 합니다.
# ❌ list는 변경 가능하므로 키로 못 쓴다
cache = {}
cache[[1, 2, 3]] = "value"
# ✅ tuple처럼 불변 값을 키로 사용
cache = {}
cache[(1, 2, 3)] = "value"# ❌ 없는 키를 []로 읽으면 KeyError
settings = {}
# print(settings["theme"])
# ✅ 선택값이면 get()으로 기본값 지정
theme = settings.get("theme", "light")# ❌ 없는 키에 바로 += 하면 KeyError
counts = {}
# counts["apple"] += 1
# ✅ get()으로 기본값을 같이 둔다
counts["apple"] = counts.get("apple", 0) + 1참고 링크
2 sources