edubun
日本語

辞書

辞書にないキーを調べると、プログラムはKeyErrorで止まりますが、d.get(key, 0)は代わりに0を返します。

ソヨンには投票用紙が12枚と、3人の候補者がいる

背景ソヨン(架空の生徒)が、学級委員の票を数えています。3人のクラスメート、Ari、Bo、Cyが立候補しています。折りたたまれた12枚の投票用紙が箱に入っています。紙の上なら、ページの横に3つの名前を書き、用紙を開くたびに、その名前の隣に正の字を1画加えるでしょう。彼女はPythonでも同じことをしたいのですが、リストでは扱いにくいことにすぐ気づきます。リストでは、位置0がAri、位置1がBoと覚えておかなければなりません。彼女がほしいのは、名前から直接数へ進む表です。

その表が辞書です。辞書は組を保存します。キーと、それに対応する値です。波括弧の中に、各キーと値の間にコロンを置いて書きます。値を読むには、リストの後ろにインデックスを置くように、キーを角括弧に入れます。組を追加したり変えたりするには、そのキーに代入します。

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
出力
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
辞書は、各キーを1つの値に対応づけます。votes["Bo"]は、位置を数えずに5へ直接行きます。

投票用紙全体を1つのループで数える

投票用紙ごとに1行ずつ入力するのは、正の字を書くのと変わりません。ソヨンは投票用紙をリストに入れ、リストの各要素をループでたどります。1つ困る点があります。あらかじめ用意していない人の名前が書かれていたら、あるいは、先に候補者を並べたくなかったらどうするか。角括弧で存在しないキーを読むと、プログラムは止まります。メソッドget(key, default)がこれを解決します。キーがあれば値を、なければ既定値を返すので、votes.get(name, 0) + 1は、最初の票にも、その後のすべての票にも使えます。

ballots = ["Bo", "Ari", "Bo", "Cy", "Bo", "Ari",
           "Cy", "Bo", "Ari", "Bo", "Cy", "Bo"]
votes = {}
for name in ballots:
    votes[name] = votes.get(name, 0) + 1
print(votes)
print(len(ballots), sum(votes.values()))
出力
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

最後の行はソヨンの確認です。12枚の用紙が入り、数を合計すると12になるので、失われたものはありません。出力の名前の順序に注目してください。Boが最初です。ループが最初に出会った名前がBoだったからです。Python 3.7以降、辞書はキーを最初に追加された順に保ち、チュートリアルの辞書の節も同じことを述べています。

キーと値をいっしょにたどる

辞書をたどるforループは、キーを返します。items()はキーと値をいっしょに返し、結果の表にほしいものです。inはキーが存在するかを調べ、key=votes.getを付けたmax()は、最大の値をもつキーを見つけます。最後のものは、すべての部分の意味がわからないうちでも、そのまま写す価値のあるパターンです。

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

辞書は、データが名前と値の組で来るところ、つまり単語とその意味、地下鉄の駅とその路線番号、学籍番号と名前のどこにでも現れます。キーは一意でなければならず、既存のキーに代入すると、2つ目の複製を加えるのではなく、古い値を置き換えます。

辞書{ }の中の、キー: 値の組
キー値を調べるのに使う名前。キーは一意
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)
よくある間違い
  • 「Danが票を得ていなければ、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の行は、ひとまとまりで覚える価値があります。ものを数えることが、初心者のプロジェクトで辞書が最もよく担う仕事だからです。得票数を合計すると投票用紙の枚数になるかという確認は、早くから身につけたい習慣です。韓国の高校の情報科では、適切なデータ型を選ぶことが独立した基準で、辞書とリストの比較がそこに合います。
ポイント
  • 辞書は、キー: 値の組を{ }に保存する。
  • d[key]は値を読む。存在しないキーはKeyError。
  • d.get(key, default)は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