Python の dictionary(辞書)は、キーと値のペアで構成されたオブジェクトです。 他の言語では、マップやハッシュと呼ばれていたりします。
dictionary オブジェクトを生成する ({}, dict)
dictionary は {}
あるいは、dict()
を使って生成できます。
Python の dictionary は、JavaScript のオブジェクトにそっくりです。
空の dictionary を作成する
初期値を持つ dictionary を作成する
dictionary オブジェクトを生成するときに、キーと値のペアを列挙することで、初期値を設定できます。
{}
を使った初期化用の構文を使うか、dict()
関数にキーワード引数の形で初期値を指定します。
dictionary の要素を参照・変更する ([], get)
Python で dictionary オブジェクトの要素を参照するには下記のように []
でキーを指定します。
キーが存在しない場合は、KeyError
が発生します。
val = d['key'] # 要素を参照する
d['key'] = val # 要素を追加する
キーが存在しない場合に、デフォルト値を返したい場合は get()
メソッドを使用します。
val = d.get('key', default=None)
dictionary の要素数を取得する (len)
Python で dictionary オブジェクトの要素数を調べるには、組み込み関数の len()
を使用します。
len()
関数は dictionary のメソッドではないことに注意してください。
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> len(d)
3
ちなみに、list
や tuple
オブジェクトの要素数や、文字列 (str
) の文字数を調べる場合も、同様に組み込み関数の len()
を使用します。
dictionary に指定したキーが存在するか調べる (in)
Python の dictionary オブジェクトが、指定したキーを持っているかを判別するには、in
キーワードを使用します。
if 'key1' in d:
print('key1 が存在します')
Python 2 の頃は、下記のように has_key()
メソッドを使用することができましたが、Python 3 以降は in
キーワードしか使用できなくなりました。
if d.has_key('key1'):
print('key1 が存在します')
dictionary の要素を削除する (del)
Python の dictionary から指定したキーの要素を削除するには、del
キーワードを使用します。
del d['key']
次のサンプルでは、実際に要素が削除されているかを in
で確認しています。
>>> d = {'key1': 100, 'key2': 200}
>>> 'key1' in d
True
>>> del d['key1']
>>> 'key1' in d
False
削除済みの要素を参照しようとするとエラー (KeyError
) になります。
>>> d['key1']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'key1'
dictionary をループ処理する
単純なループ
dictionary オブジェクトを for-in
ステートメントに渡すと、ループ処理でキーを 1 つずつ取り出すことができます。
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> for key in d:
... print(key, d[key])
...
two 2
three 3
one 1
キーと値のペアを取り出しながらループ (items)
dictionary オブジェクトをループ処理するときに、キーと値を同時に取り出しながら処理したい時は items()
メソッドを使用します。
>>> d = {'one': 1, 'two': 2, 'three': 3}
>>> for key, val in d.items():
... print(key, val)
...
two 2
three 3
one 1
ちなみに、Python 2 の頃は iteritems()
メソッドを使用できましたが、Python 3 からは items()
メソッドのみ使用可能です。
連番を振りながらループ (enumerate)
enumerate
と組み合わせることで、0 から始まる連番を振りながらループ処理することができます(list
オブジェクトも同様のループ処理が可能です)。
>>> for i, key in enumerate(d):
... print('[{}] {}: {}'.format(i, key, d[key]))
...
[0] one: 1
[1] two: 2
[2] three: 3