2.9. 辞書

辞書キー から へのマッピングです。各キーは直接参照され、辞書はそのキーに最後に関連付けられた値を記憶します。

2.9.1. 辞書の作成

波かっこで key: value のペアを使うか、dict コンストラクタを使います:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

値には任意の型を使えます。文字列、数値、リスト、さらには別の辞書も使えます:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
辞書を2列で表したもの。左にキー、右に値があり、 各ペアを矢印で結んでいる。

辞書内の各キーはちょうど1つの値にマッピングされます。

2.9.2. アクセスとメンバーシップ

[] でインデックス指定すると、キーに対応する値を取得します。存在しないキーは KeyError を送出します:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

寛容な参照には dict.get() を使います。存在しないキーに対しては None を返すか、第2引数に渡した値を返します:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

in キーワードは、値ではなく キー のメンバーシップをテストします:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. 追加、更新、削除

d[key] への代入は、キーが新しい場合はエントリを追加し、すでに存在する場合は上書きします:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

削除にはいくつかの形式があります:

  • del d[key] -- エントリを削除します。キーが存在しない場合は KeyError を送出します。

  • dict.pop() -- 値を削除して返します。オプションのデフォルト値を指定すると例外を回避できます。

  • dict.clear() -- すべてのエントリを削除します。

dict.update() は、別の辞書(または (key, value) ペアのリスト)を受け取り側にマージし、一致するキーをすべて上書きします:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. 反復処理

辞書を直接反復処理すると、挿入順にそのキーが得られます:

for k in person:
    print(k)

3つのビューが明示的なアクセスを提供します:

  • dict.keys() -- キー(辞書を反復処理するのと同じ)。

  • dict.values() -- 値。

  • dict.items() -- (key, value) のタプル。ループ内でのアンパックに最適です。

for key, value in person.items():
    print(key, "=", value)

2.9.5. キーになれるもの

辞書のキーは ハッシュ可能 でなければなりません。つまり、その値が生存期間中に変化してはなりません。一般的なハッシュ可能型は次のとおりです:

listdictbytearray のようなミュータブル型はキーにできません。使用すると TypeError を送出します。イミュータブルな値のタプルは、2次元グリッド座標のような複合的な識別子で辞書をキー付けする標準的な方法です:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. 長さ

len() はエントリの数を返します:

>>> len(person)
4