edubun
한국어

딕셔너리

딕셔너리에 없는 키를 찾으면 KeyError로 프로그램이 멈추지만, d.get(key, 0)은 대신 0을 돌려줍니다.

서연이 앞에 투표용지 12장과 후보 세 명

배경서연이(지어낸 학생)가 반장 선거 표를 세고 있습니다. 후보는 아리, 보라, 채윤 세 명이고, 접힌 투표용지 12장이 상자에 들어 있습니다. 종이로 센다면 공책 왼쪽에 이름 셋을 적고 한 장 펼 때마다 이름 옆에 바를 정(正) 자를 한 획씩 그었겠지요. 서연이는 이 일을 파이썬으로 해 보려는데, 리스트로는 불편하다는 것을 금방 알게 됩니다. 리스트라면 0번 자리가 아리, 1번 자리가 보라라는 것을 따로 기억해야 하기 때문입니다. 서연이가 원하는 것은 이름에서 곧장 표 수로 가는 표입니다.

그런 표가 딕셔너리입니다. 딕셔너리는 키와 그 키에 딸린 값을 한 쌍으로 저장합니다. 중괄호 안에 키: 값 꼴로 씁니다. 값을 읽을 때는 리스트에 인덱스를 쓰듯 대괄호 안에 키를 넣습니다. 새 쌍을 더하거나 값을 바꿀 때는 그 키에 대입합니다.

votes = {"아리": 0, "보라": 0, "채윤": 0}
votes["보라"] = votes["보라"] + 1
votes["아리"] += 1
votes["보라"] += 1
print(votes)
print(votes["보라"])
출력
{'아리': 1, '보라': 2, '채윤': 0}
2
딕셔너리는 키마다 값 하나를 짝지어 둡니다. votes["Bo"]는 위치를 세지 않고 곧장 5로 갑니다.

상자 전체를 반복문 하나로 셉니다

투표용지마다 한 줄씩 치는 것은 바를 정 자를 긋는 것보다 나을 게 없습니다. 서연이는 투표용지를 리스트에 담고 반복문으로 돌립니다. 문제가 하나 있습니다. 미리 적어 두지 않은 이름이 나오면, 또는 후보 이름을 처음부터 적어 두고 싶지 않다면 어떻게 할까요? 없는 키를 대괄호로 읽으면 프로그램이 멈춥니다. 이럴 때 get(키, 기본값) 메서드를 씁니다. 키가 있으면 그 값을, 없으면 기본값을 돌려주므로 votes.get(name, 0) + 1은 첫 표에도, 그 뒤의 모든 표에도 통합니다.

ballots = ["보라", "아리", "보라", "채윤", "보라", "아리",
           "채윤", "보라", "아리", "보라", "채윤", "보라"]
votes = {}
for name in ballots:
    votes[name] = votes.get(name, 0) + 1
print(votes)
print(len(ballots), sum(votes.values()))
출력
{'보라': 6, '아리': 3, '채윤': 3}
12 12

마지막 줄은 서연이의 검산입니다. 투표용지 12장이 들어갔고 표 수의 합도 12이니 빠진 표가 없습니다. 출력의 이름 순서도 보세요. 반복문이 처음 만난 이름이 보라라서 보라가 맨 앞에 있습니다. 딕셔너리는 키를 처음 넣은 순서대로 간직하며, 튜토리얼의 딕셔너리 부분에도 그렇게 적혀 있습니다.

키와 값을 함께 꺼내기

딕셔너리를 for로 돌리면 키가 하나씩 나옵니다. items()를 쓰면 키와 값이 함께 나와서 결과표를 만들기 좋습니다. in은 키가 있는지 확인하고, max()에 key=votes.get을 주면 값이 가장 큰 키를 찾습니다. 마지막 것은 모든 부분이 이해되기 전이라도 그대로 가져다 쓸 만한 모양입니다.

votes = {"Bo": 6, "Ari": 3, "Cy": 3}
for name, n in votes.items():
    print(name, "#" * n, n)
print("Dan" in votes)
print(max(votes, key=votes.get))
출력
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

딕셔너리는 이름과 값이 짝을 이루는 자료라면 어디에나 쓰입니다. 낱말과 뜻, 지하철역과 노선 번호, 학번과 이름이 그렇습니다. 키는 겹칠 수 없고, 이미 있는 키에 대입하면 둘째 쌍이 생기는 것이 아니라 원래 값이 바뀝니다.

딕셔너리{ } 안의 키: 값 쌍
키값을 찾을 때 쓰는 이름. 겹칠 수 없음
d[key]값을 읽음. 키가 없으면 KeyError
d.get(key, default)값을 읽고, 키가 없으면 기본값을 줌
d.items()for에서 키와 값을 함께 꺼냄
key in d그 키가 있으면 True
  1. 무엇이 출력될까요?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. 무엇이 출력될까요?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. 무엇이 출력될까요?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. 무엇이 출력될까요?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. 실행하면 어떻게 될까요?
    stock = {"pens": 4}
    print(stock["tape"])
    • 0을 출력한다
    • None을 출력한다
    • tape를 출력한다
    • KeyError: 'tape'로 멈춘다
  6. 무엇이 출력될까요?
    counts = {}
    for ch in "hello":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. 무엇이 출력될까요?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. 무엇이 출력될까요?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. 무엇이 출력될까요?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. 무엇이 출력될까요?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
자주 하는 실수
  • 「표를 못 받은 사람은 votes["Dan"]이 0이다.」 "Dan"을 키로 넣은 적이 없으면 KeyError: 'Dan'로 멈춥니다. 키가 없을 수도 있으면 votes.get("Dan", 0)을 쓰세요.
  • 「14 in ages로 14살인 사람이 있는지 확인한다.」 in은 값이 아니라 키를 봅니다. 값에서 찾으려면 14 in ages.values()라고 씁니다.
  • 「딕셔너리도 리스트처럼 위치가 있으니 votes[0]이 첫 후보다.」 딕셔너리는 위치가 아니라 키로 찾습니다. votes[0]은 0이라는 키를 찾다가 KeyError: 0을 냅니다.
선생님 메모종이에 바를 정 자를 긋는 활동이 다리가 됩니다. 실제로 했거나 지어낸 표 몇 장을 먼저 손으로 세게 한 다음, 딕셔너리가 왼쪽에 이름, 오른쪽에 표 수를 적은 바로 그 표라는 것을 보여 주세요. get(key, 0) + 1 줄은 통째로 외워 둘 만합니다. 무언가를 세는 일이 초보 프로젝트에서 딕셔너리를 가장 많이 쓰는 곳이기 때문입니다. 표 수를 더해서 투표용지 수와 맞는지 확인하는 검산 습관도 일찍 들이면 좋습니다. 고등학교 정보 [12정03-04]가 알맞은 자료형 고르기를 다루니, 같은 문제를 리스트와 딕셔너리로 각각 풀어 보고 견주는 활동을 붙일 수 있습니다.
핵심 정리
  • 딕셔너리는 { } 안에 키: 값 쌍을 저장.
  • d[key]로 값을 읽고, 없는 키는 KeyError.
  • d.get(key, 기본값)으로 KeyError를 피함.
  • counts[x] = counts.get(x, 0) + 1이 세기의 기본 모양.
  • for k, v in d.items(): 넣은 순서대로 쌍을 꺼냄.
이 과정의 출처 (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

확인한 날: 2026-10-19