#
8 マップ型

マップ型 (mapping) オブジェクトは変更不可能な値を任意の オブジェクトに 対応付けます。対応付け自体は変更可能なオブジェクトです。 現在のところは標準のマップ型、dictionary だけです。 辞書のキーにはほとんど任意の値をつかうことができます。使うことが できないのはリスト、辞書、その他の変更可能な型 (オブジェクトの一致 ではなく、その値で比較されるような型) です。 キーに使われた数値型は通常の数値比較規則に従います: 二つの数字を 比較した時等価であれば (例えば `1` と `1.0` のように)、 これらの値はお互いに同じ辞書のエントリを示すために使うことが できます。

辞書は `key: value` からなるペアを カンマで区切ったリストを波括弧の中に入れて作ります。 例えば: `{'jack': 4098, 'sjoerd': 4127}` または `{4098: 'jack', 4127: 'sjoerd'}` です。

以下の操作がマップ型で定義されています (ここで、a および b はマップ型で、k はキー、 v および x は任意の オブジェクトです):

操作 | 結果 | 注釈
--- | --- | ---
`len(a)` | a 内の要素の数です |
`a[k]` | キー k を持つa の要素です | (1), (10)
`a[k] = v` | `a[k]` を v に設定します |
`del a[k]` | a から `a[k]` を削除します | (1)
`a.clear()` | `a` から全ての要素を削除します |
`a.copy()` | `a` の(浅い)コピーです |
`k in a` | a にキー k があれば `True` 、 そうでなければ `False` です | (2)
`k not in a` | `not` k in a と同じです | (2)
`a.has_key(k)` | k `in` a と同じなので、新しく書くコードではその形を使ってください |
`a.items()` | a における (key, value) ペアのリストのコピーです | (3)
`a.keys()` | a におけるキーのリストのコピーです | (3)
`a.update([b])` | b によって key/value ペアを更新（上書き） | (9)
`a.fromkeys(seq[, value])` | seq からキーを作り、値が value であるような、新しい辞書を作成します | (7)
`a.values()` | a における値のリストのコピーです | (3)
`a.get(k[, x])` | もし `k in a`なら`a[k]`、 そうでなければ xを返します | (4)
`a.setdefault(k[, x])` | もし `k in a`なら`a[k]`、 そうでなければ x (が与えられていた場合)を返します | (5)
`a.pop(k[, x])` | もし `k in a` なら `a[k]` 、 そうでなければ x を返して kを除去します | (8)
`a.popitem()` | 任意の (key, value) ペアを除去して返します | (6)
`a.iteritems()` | (key, value) ペアにわたるイテレータを返します | (2), (3)
`a.iterkeys()` | マップのキー列にわたるイテレータを返します | (2), (3)
`a.itervalues()` | マップの値列にわたるイテレータを返します | (2), (3)

注釈:

(1)
  k がマップ内にない場合、例外 `KeyError` を 送出します。
(2)
  バージョン 2.2 で 新たに追加 された仕様です。

(3)
  キーおよび値は任意の順序でリスト化されています。この順序は ランダムではなく、Pythonの実装によって異なり、辞書の挿入、削除の履歴に 依存します。 `items()`、 `keys()`、 `values()`、 `iteritems()`、 `iterkeys()`および `itervalues()`が 途中で辞書を変更せずに呼ばれた場合、リストも直接対応するでしょう。 これにより、`(value, key)` のペアを `zip()` を 使って: "`pairs = zip(a.values(), a.keys())`" のように生成することができます。`iterkeys()` および `itervalues()` メソッドの間でも同じ関係が成り立ちます: "`pairs = zip(a.itervalues(), a.iterkeys())`" は `pairs` と同じ値になります。 同じリストを生成するもう一つの方法は "`pairs = [(v, k) for (k, v) in a.iteritems()]`"です。

(4)
  k がマップ中になくても例外を送出せず、代わりに x を返します。x はオプションです; x が与えられて おらず、かつ k がマップ中になければ、 `None` が返されます。

(5)
  `setdefault()` は `get()` に似ていますが、 k が見つからなかった場合、x が返されると同時に辞書の k に対する値として挿入されます。デフォルトで x は Noneです。

(6)
  `popitem()` は、集合アルゴリズムでよく行われる ような、辞書を取り崩しながらの反復を行うのに便利です。もし辞書が空なら `popitem()` の呼び出しは `KeyError` の送出を引き起こします。

(7)
  `fromkeys()` は、新しい辞書を返すクラスメソッドです。 value のデフォルト値は `None` です。 バージョン 2.3 で 新たに追加 された仕様です。

(8)
  `pop()` は、デフォルト値が渡されず、かつ、キーが見つからない場合に、 `KeyError` を送出します。 バージョン 2.3 で 新たに追加 された仕様です。

(9)
  `update()` はその他のマッピングオブジェクトや反復可能な キー/値のペア（タプルやその他2つの要素を持つ反復可能な要素）を受け入れます。 キーワードとなる引数が指定されている場合、マッピングはそれらのキー/値のペアで 更新されます。 "`d.update(red=1, blue=2)`" バージョン 2.4 で 変更 された仕様: キー／値のペアでできたイテレーション可能オブジェクトを引数に取るようになりました。また、キーワード引数をとるようになりました。

(10)
  dict のサブクラスが `__missing__` メソッドを定義しているならば、 キー k が無ければ a[k] は k を引数にそのメソッドを 呼び出します。したがってキーが無いときに a[k] が結果を返すのも 例外を送出するのも、`__missing__`(k) が結果を返すか 例外を送出するかで決まります。他のどんなメソッドも演算も `__missing__`() を呼び出すことはありません。このような `__missing__` が定義されていなければ、`KeyError` が送出されます。 `__missing__` はメソッドでなければならず、インスタンス変数では駄目です。 例として `collections`.`defaultdict` を見てください。 バージョン 2.5 で 新たに追加 された仕様です。