딕셔너리는 조회 테이블이에요
리스트는 위치로 인덱싱돼요. 딕셔너리는 키 — 보통 문자열이나 숫자 — 로 인덱싱되고, 각 키는 하나의 값에 매핑돼요. 이 한 가지 변화가 엄청난 범위의 프로그램을 열어줘요: 재고, 설정, JSON 페이로드, 사용자 프로필, 캐시 등등.
키와 값은 거의 뭐든 될 수 있어요. 키는 해시 가능해야 해요(그래서 숫자, 문자열, 튜플은 되지만 리스트나 다른 dict는 안 돼요). 값에는 제약이 없어요 — dict 안에 dict나 list를 비롯해 뭐든 담을 수 있습니다.
딕셔너리 만들기
여러 방법이 있고 각각 쓰임이 있어요:
값 읽기
두 가지 방법이 있고, 선택이 중요해요:
의도에 따라 고르세요:
- 키가 반드시 있어야 할 때는
[]. 없다면 그건 버그고, 큰 소리로 에러가 나길 원할 거예요. - "없음"이 정상적인 경우일 때는
.get(). try/except 없이도 기본값을 다룰 수 있어요.
추가, 갱신, 삭제
키에 할당하면 키가 생기거나 갱신돼요:
update()는 다른 dict나 쌍의 이터러블을 병합합니다:
overrides에 있는 겹치는 키가 settings의 값을 덮어써요.
키 존재 확인
in은 값이 아니라 키를 검사해요:
값을 검사하려면 user.values()를 써야 해요:
딕셔너리 순회하는 법
반복할 수 있는 뷰가 세 가지 있어요:
대부분의 경우 .items()를 꺼내 쓰게 돼요 — 바로 언패킹돼서 쓸 수 있는 쌍을 주니까요.
현대 파이썬(3.7+)에서 순회 순서는 삽입 순서와 같아요. dict는 "마법의 주머니"가 아니에요 — a, b, c 순으로 넣으면 그 순서로 반복돼요. 언어 수준의 보장이라 믿어도 됩니다.
딕셔너리 정렬하는 법
딕셔너리는 삽입 순서를 유지하니까, dict를 "정렬한다"는 건 사실 원하는 순서로 키를 삽입한 새 dict를 만든다는 뜻이에요:
sorted()가 쌍의 리스트를 돌려주고, 그걸 dict(...)로 감싸서 새 순서로 다시 dict를 만드는 거예요. 정렬된 쌍만 필요하고 dict는 필요 없다면, 바깥 dict() 호출은 빼세요.
두 딕셔너리 병합하는 법
Python 3.9+에서는 | 연산자가 있어요:
키 충돌이 있으면 오른쪽 dict의 값이 이겨요. .update()는 제자리 버전이고요. 예전 파이썬 버전에서는 {**defaults, **overrides}를 쓰세요.
setdefault 패턴
자주 있는 요구: "키가 있으면 그 값을 쓰고, 없으면 기본값을 설정한 뒤 쓴다."
아니면 collections.Counter를 쓰는 게 더 좋아요:
Counter는 개수 세기를 기본으로 하는 dict 하위 클래스예요. 등장 횟수를 세는 상황이라면 언제나 맞는 선택이에요.
딕셔너리 컴프리헨션
리스트 컴프리헨션과 같은 구조지만, dict를 만들어요:
규칙은 리스트 컴프리헨션과 같은데, 중괄호 사이에 key: value가 들어간다는 게 달라요.
dict는 JSON의 쌍둥이
파이썬 dict는 JSON 객체와 거의 완벽하게 대응돼요. 서로 변환하는 게 한 번의 호출이면 끝납니다:
그래서 웹 작업에서 dict가 어디에나 나타나요 — API 요청과 응답은 사실상 중간에 네트워크가 좀 낀 dict 조작이에요.
실용적인 예제
사용자 프로필을 다루는 작은 설정 같은 프로그램:
중첩 dict, 가변 값, 기본값과 함께 쓰는 .get() — 레코드 형태의 어떤 데이터에도 쓸 기본 도구 세트예요.
다음으로
리스트, 튜플, 집합, 딕셔너리. 이 네 개의 컬렉션을 손에 쥐면 초반에 만날 대부분의 데이터를 모델링할 수 있어요. 다음은 리스트 컴프리헨션을 배울 거예요 — 하나의 컬렉션을 다른 것으로 변환하는 파이썬의 간결한 방식입니다.
자주 묻는 질문
파이썬의 딕셔너리가 뭔가요?
딕셔너리는 키-값 쌍의 모음이에요. 위치가 아니라 키로 값을 찾아요 — prices[0]이 아니라 prices['apple']이죠. 읽고 쓰는 게 빠르고, 키는 유일해야 하며, 현대 파이썬에서는 삽입한 순서가 유지돼요.
파이썬 딕셔너리에 키를 어떻게 추가하나요?
그냥 할당하면 돼요: my_dict['new_key'] = 'new value'. 키가 이미 있으면 값이 덮어쓰기되고, 없으면 새로 추가돼요. "삽입"과 "갱신" 문법이 따로 없어요 — 같은 문법이에요.
dict[key]와 dict.get(key)는 뭐가 다른가요?
dict[key]는 키가 없으면 KeyError를 던져요. dict.get(key)는 대신 None(또는 지정한 기본값)을 돌려줍니다. 키가 없는 게 정상일 때는 .get()을, 없는 게 버그라면 [key]를 쓰세요.