辞書(dict)の基礎知識 – Python3 入門 マニュアル

このページではPython3の辞書型(dict)についての基礎知識から実用的な使い方まで、辞書型データの操作に必要な知識をまとめています。

Python の辞書(dict)は JavaScript / PHP / Perl / Ruby 等、他のプログラミングの連想配列・ハッシュにおよそ相当します。

生成と要素の取得

辞書の生成

辞書の生成は波括弧 {  } を使います。文字列と数値のように異なる型の要素を混在することも可能です。

 

Python3 の辞書はJSON(JavaScript Object Notation)にとてもよく似ています。JSON 同様に可読性のため複数行に分けて記述することもあります。

 

dict クラスによる生成

dict クラスにより辞書型データを生成することもできます。

 

値の取得

辞書から値を参照する方法は「キーを指定する方法」と「get()メソッドによる」2つの方法ありますが、通常は「キーを指定する方法」を用います。

 

get() メソッドの利点

「キーを指定する方法」はキーが定義されていない場合、KeyError になります。一方、get() メソッドではエラーにならず、None を返します。

辞書の内容が不明な場合や動的に変わる場合には dict.get()メソッドで取得するのが良いでしょう。

 

要素数を取得

組み込み関数 len() により辞書の要素数を取得できます。

 

要素の追加・変更・削除

要素の追加

辞書[キー] = 値 により辞書に要素を追加できます。

 

値の変更(置換)

辞書[キー] = 値  により値を変更できます。

 

要素の削除

要素の削除は del 文または pop() メソッドを使用します。

pop() メソッドと del 文のいずれも辞書の要素を削除しますが、dict.pop() はキーに対応する値を返す、del 文は値を返さない、という違いがあります。

 

要素の全削除

辞書の要素を全削除する場合には dict.clear() メソッドを使用します。※clear() メソッドを使用すると空の辞書になります。

 

要素を含むかの判定・検索

in 演算子を使用することで、キーに対応する要素が辞書に含まれるかを判定できます。

 

not in により含まないことを判定できます。

 

辞書の結合

文字列リストタプルと異なり、辞書は + 演算子による結合ができないことに注意しましょう。

dict.update() メソッドで結合

辞書を結合するには update() メソッドを使用します。

 

辞書のループ処理(for ループ)

辞書には3種類のループ処理があります。

キーを反復取得

for 文と dict.keys() メソッドにより、辞書からキーを反復取得できます。

 

バリュー(値)を反復取得

for 文と dict.values() メソッドにより、辞書からバリュー(値)を反復取得できます。

 

キーとバリュー(値)を反復取得

for 文と dict.items() メソッドにより、辞書からキーとバリュー(値)を反復取得できます。※JavaScript の forEach、PHP の foreach と同じような処理ができます。

 

辞書の並び替え(ソート)

辞書をソートするには 組み込み関数sorted() と 無名関数 lamda を組み合わせます。

具体的なコードは lambda式で辞書やリストをスマートに並び替える – サンプルコード付を参照ください。

 

辞書の代入とコピーに関する注意点(重要)

リストと同様に辞書のコピーも注意が必要です。下記サンプルコードの print(a) 結果はどうなるでしょうか?

答えは以下となります。変数 a の要素も連動して変更されることに注意しましょう。

 

これは Python3 公式ドキュメントの浅いコピーおよび深いコピー操作にあるように、リストや辞書の代入文はオブジェクトをコピーせず参照渡しするためです。

a と b の要素を連動せず独立にしたい場合には、のdict.copy()メソッドによりコピー(浅いコピー)します。

 

辞書の内包表記

リストと同様に辞書も内包表記ができます。リストほど多用されませんが、辞書も内包表記ができることを頭に入れておきましょう。

※Python3 の内包表記について不明な場合はリストの内包表記を参照ください。

辞書の内包表記サンプル

過剰な内包表記は、あなた以外の開発メンバーにとって意味不明な記述になります。複雑な場合には冗長でも for文等により記述しましょう。