딕셔너리 (Dictionary)
요약
Python 딕셔너리 생성·접근·메서드(items/values/get)·빈도 카운팅·컴프리헨션까지. 정보처리기사 실기에 출제되는 딕셔너리 핵심 개념을 정리합니다.
딕셔너리 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 딕셔너리 생성 | 키-값 쌍으로 데이터 저장 | d = {"a": 1, "b": 2} |
| 딕셔너리 접근 | 키를 사용하여 값 조회 | d["a"] → 1 |
| keys / values / items | 키·값·쌍을 차례대로 꺼내기 | d.items() → [('a',1), ...] |
| get(key, default) | 키가 없으면 기본값 반환 | d.get("x", 0) → 0 |
| sum / len | 값의 합과 항목 수 집계 | sum(d.values()), len(d) |
| 딕셔너리 컴프리헨션 | 반복문으로 딕셔너리 생성 | {i: i*2 for i in lst} |
딕셔너리 기초
딕셔너리(Dictionary) 는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 자료구조입니다. 키를 통해 값에 빠르게 접근할 수 있습니다.
딕셔너리 생성
딕셔너리 접근 및 수정

키 목록과 값 목록 조회
keys()·values()·items()의 결과는 list()로 감싸 리스트로 바꿔 출력하는 경우가 많습니다.
![딕셔너리 d의 키 열에서 list(d.keys())의 ['a', 'b', 'c'], 값 열에서 list(d.values())의 [1, 2, 3], 키와 값 쌍 전체에서 list(d.items())의 [('a', 1), ('b', 2), ('c', 3)]가 만들어지는 과정을 색으로 대응한 다이어그램](/_next/image?url=%2Fcoding%2Fpython%2Fdict%2Fdict-keys-values-items.webp&w=3840&q=75&dpl=dpl_E8Fpk4vZ8Su5MuNchuBj2koAMXpV)
list() 없이 그대로 출력하면?
keys()·values()·items()는 리스트가 아니라 dict_keys·dict_values·dict_items라는 별도 객체를 돌려줍니다. 그래서 list()로 감싸지 않고 출력하면 객체 이름이 앞에 붙어 나옵니다.
이 객체들은 이터러블이라 for문으로 하나씩 꺼내거나 sum()에 바로 넣을 수 있고, len()으로 개수도 셀 수 있습니다. 그래서 순회하거나 합계를 구할 때는 list()로 바꿀 필요가 없습니다.
enumerate()를 활용하면 반복문에서 인덱스와 값을 동시에 얻을 수 있습니다.
딕셔너리 메서드로 순회하기
keys()·values()·items()는 각각 키만, 값만, 키와 값 쌍을 하나씩 꺼내주는 메서드입니다. for문과 결합하면 딕셔너리 전체를 훑으면서 작업을 할 수 있습니다.

items()의 결과는 (키, 값) 튜플 묶음입니다. for k, v in d.items()처럼 두 변수로 받으면 튜플이 자동으로 분해되어 k에는 키, v에는 값이 들어갑니다.
출력이 a → b → c 순서로 나오는 것은 딕셔너리가 키를 넣은 순서를 기억하기 때문입니다. Python 3.7부터 언어 규칙으로 보장되는 동작이라, keys()·values()·items()로 순회하거나 print(d)로 출력해도 항상 넣은 순서대로 나옵니다. 이미 있는 키의 값을 바꿔도 순서는 그대로입니다.
딕셔너리를 그대로 순회하면 키가 나옵니다
메서드 없이 딕셔너리를 for에 그대로 넣으면 값이 아니라 키만 꺼내집니다. list(), sorted()처럼 이터러블을 받는 함수에 그대로 넣어도 마찬가지입니다.
값이 필요하면 d.values(), 키와 값이 모두 필요하면 d.items()를 넣습니다.
sum(d.values()) — 값의 합 집계
sum()은 이터러블의 모든 값을 더해주는 내장 함수입니다. values()가 값만 꺼내주므로 sum(d.values()) 하나로 딕셔너리 전체 값의 합계를 구할 수 있습니다.

| 표현식 | 꺼내는 값 | 결과 |
|---|---|---|
sum(d.values()) | 값만 | 값 전체의 합 |
sum(d.keys()) | 키만 (숫자 키일 때) | 키 전체의 합 |
len(d) | — | 키-값 쌍의 개수 |
get(key, default) — 키가 없을 때 기본값 반환
딕셔너리에서 값을 꺼낼 때 d["x"]처럼 대괄호로 접근하면 키가 없을 경우 KeyError가 발생합니다. get() 메서드는 키가 있으면 값을, 없으면 미리 정해 둔 기본값을 돌려줍니다.
![딕셔너리 d에 'a'와 'b'만 있을 때, 있는 키 'a'는 세 방식 모두 1을 반환하고 없는 키 'x'는 d['x']가 KeyError, d.get('x')가 None, d.get('x', 0)이 0을 반환하는 분기 다이어그램](/_next/image?url=%2Fcoding%2Fpython%2Fdict%2Fdict-get-default.webp&w=3840&q=75&dpl=dpl_E8Fpk4vZ8Su5MuNchuBj2koAMXpV)
여기서 "키가 없다"는 것은 그 키를 딕셔너리에 아직 넣은 적이 없다는 뜻입니다. 위 예시의 d에는 "a"와 "b"만 들어 있으므로 "x"는 없는 키입니다. 실기에서는 빈 딕셔너리 {}에서 출발해 값을 하나씩 채워 가는 코드가 많은데, 이때 처음 만나는 키는 아직 딕셔너리에 없습니다. 아래 빈도수 카운팅 패턴이 대표적인 예입니다.
| 접근 방식 | 키 있을 때 | 키 없을 때 |
|---|---|---|
d[key] | 값 반환 | KeyError 발생 |
d.get(key) | 값 반환 | None 반환 |
d.get(key, default) | 값 반환 | default 반환 |
빈도수 카운팅 패턴
get(key, default)의 가장 큰 쓰임새는 빈도수 카운팅입니다. 문자열이나 리스트를 순회하며 각 요소가 몇 번 등장하는지 세는 패턴에서, d[key] = d.get(key, 0) + 1 한 줄로 "처음 본 키는 0에서 시작, 이미 본 키는 기존 값에 +1"을 표현할 수 있습니다.

한 줄씩 풀어 보면 다음과 같습니다.
| 반복 | ch | freq.get(ch, 0) | freq[ch] = ... 이후 freq |
|---|---|---|---|
| 1 | b | 0 (없음) | {'b': 1} |
| 2 | a | 0 (없음) | {'b': 1, 'a': 1} |
| 3 | n | 0 (없음) | {'b': 1, 'a': 1, 'n': 1} |
| 4 | a | 1 | {'b': 1, 'a': 2, 'n': 1} |
| 5 | n | 1 | {'b': 1, 'a': 2, 'n': 2} |
| 6 | a | 2 | {'b': 1, 'a': 3, 'n': 2} |
get이 없다면 "키가 있으면 +1, 없으면 1로 초기화" 두 가지 경우를 if-else로 나누어 써야 합니다. get(ch, 0) 덕분에 첫 등장도 초기값 0에서 출발하므로 분기 없이 한 줄로 끝납니다.
빈도 + 집계 결합
빈도 딕셔너리를 만든 뒤 sum(d.values())로 전체 글자 수를, len(d)로 서로 다른 글자의 종류 수를 한꺼번에 구할 수 있습니다.

딕셔너리 컴프리헨션
딕셔너리 컴프리헨션 은 반복문과 조건식을 사용하여 딕셔너리를 한 줄로 생성하는 문법입니다. 기본 형식·예시·조건 필터링, 그리고 리스트·집합·제너레이터 컴프리헨션과의 비교(같은 중괄호도 콜론 유무로 딕셔너리·집합이 갈리는 포인트)는 컴프리헨션 통합 정리 페이지에서 한 자리에 정리합니다.