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"],
}
辞書内の各キーはちょうど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. キーになれるもの¶
辞書のキーは ハッシュ可能 でなければなりません。つまり、その値が生存期間中に変化してはなりません。一般的なハッシュ可能型は次のとおりです:
list、dict、bytearray のようなミュータブル型はキーにできません。使用すると TypeError を送出します。イミュータブルな値のタプルは、2次元グリッド座標のような複合的な識別子で辞書をキー付けする標準的な方法です:
>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"
2.9.6. 長さ¶
len() はエントリの数を返します:
>>> len(person)
4