概要

辞書(ディクショナリ)とは、複数のデータ型を管理することができる。(連想配列とも呼ばれる)
辞書の特徴は、要素を格納する時に、キーを使用して管理することができる。

Pythonの辞書型は、要素の順番をこれまでは保持することができなかったが、Python3.7から辞書データの順番が保持される仕様になった。


辞書の定義

辞書は、複数の要素を波括弧{}で括って宣言する。
辞書の要素は、キーと値を対応させてコロンで結び、カンマで区切って格納する。

辞書 = {キー1:値1, キー2:値2, キー3:値3, ...}という形で宣言する。

 d = {"x":100, "y":200, "z":300}



辞書の操作

辞書はキーでそれぞれの値を抽出することができる。 辞書型変数に続けて角括弧でキーを指定することで、値を抽出できる。

 dic = {"x":100, "y":200}
 print(dic["x"])
 print(dic["y"])
 
 # 出力
 100
 200


次は、キーを指定して値を変更する。

 dic = {"x":100, "y":200}
 dic["x"] = 300
 print(dic)
 
 # 出力
 {'x' : 300, 'y' : 200}


次に、新たにデータを辞書に追加する。
以下の例では、新しいキーを指定して、新しい要素を追加している。(文字列のキーと数値のキーの両方で行う)

 dic = {"x":100, "y":200}
 dic["z"] = 300
 dic[10] = 400
 print(dic)
 
 # 出力
 {'x' : 100, 'y' : 200, 'z' : 300, 10 : 400}



dict関数で辞書に変換する

辞書は、文字列・タプル・リストをdict関数を使用して変換して作成することができる。
それぞれキーと要素との2つの組み合わせになったものであることが必要である。

以下の例では、リストが要素のリスト、タプルが要素のリスト、リストが要素のタプル、文字列のリスト、文字列のタプルをdict関数で変換する。

 list_of_list = [['a', 'b'], ['c', 'd'], ['e', 'f']]
 list_of_tuple = [('a', 'b'), ('c', 'd'), ('e', 'f')]
 tuple_of_list = (['a', 'b'], ['c', 'd'], ['e', 'f'])
 list_of_string = ['ab', 'cd', 'ef']
 tuple_of_string = ('ab', 'cd', 'ef')
 
 print(dict(list_of_list))
 print(dict(list_of_tuple))
 print(dict(tuple_of_list))
 print(dict(list_of_string))
 print(dict(tuple_of_string))
 
 # 出力
 {'a' : 'b', 'c' : 'd', 'e' : 'f'}
 {'a' : 'b', 'c' : 'd', 'e' : 'f'}
 {'a' : 'b', 'c' : 'd', 'e' : 'f'}
 {'a' : 'b', 'c' : 'd', 'e' : 'f'}
 {'a' : 'b', 'c' : 'd', 'e' : 'f'}


また、dict関数内で変数に値を代入しても辞書が作成できる。

 dic = dict(x=100, y=200)
 print(dic)
 
 # 出力
 {x : 100, y : 200}



辞書のメソッド

辞書型には、様々なメソッドがある。ここでは、よく使用されるものを記載する。

keys関数とvalues関数で全てのキーと値を取得する

これらの関数は、それぞれキーの全て、値の全てを取得する時に使用する。

 dic = {'x':100, 'y':200}
 print(dic.keys())
 print(dic.values())
 
 # 出力
 dict_keys(['x', 'y'])
 dict_values([100, 200])


update関数で辞書を結合する

update関数は、2つの異なる辞書を結合することができる。キーが同じ場合は新しい値に更新する。

 dic1 = {'l':10, 'm':200, 'n':300}
 dic2 = {'l':100, 'o':400}
 dic1.update(dic2)
 print(dic1)
 
 # 出力
 {'l' : 100, 'm' : 200, 'n' : 300, 'o' : 400}


get関数で値を取得する

辞書は角括弧[]にキーを指定することで値を取得することができるが、get関数を使用しても同様のことができる。
また、辞書にないキーを指定した場合、get関数では何も返さず、角括弧[]で指定した場合はエラーになる。

 dic = {'x':10, 'y':20}
 val = dic.get('x')  # d['x']と同じ操作
 print(val)
 
 # 出力
 10


pop関数で値を取得する

get関数と似たようなメソッドでpop関数がある。
pop関数もキーを指定して値を取得するが、辞書からキーで指定した値を削除するという特徴がある。

 dic = {'x':100, 'y':200, 'z':300}
 value = dic.pop('x')
 print(value)
 print(dic)
 
 # 出力
 100
 {'y' : 200, 'z' : 300}


delで要素を削除する

pop関数ではキーの値を取得した後は辞書から削除されるが、delを使用すると同様に削除することができる。

 dic = {'x':100, 'y':200, 'z':300}
 del dic['y']
 print(dic)
 
 # 出力
 {'x' : 100, 'z' : 300}


また、キーを指定せずにdel関数を使用する場合は、辞書自体が削除される。

 del dic


clear関数で値を削除する

delを使用すると辞書自体が削除されるが、clear関数を使用すると値のみを削除して空の辞書が残り、辞書自体の操作を続けることができる。

 dic = {'x':100, 'y':200, 'z':300}
 dic.clear()
 print(dic)
 
 # 出力
 {}


inでキーの有無を調べる

辞書に指定するキーがあるかを調べるには、inを使用する。
"キー" in 辞書の形で使用する。
辞書にキーが存在すればTrue、キーが存在しない場合はFalseを返す。

 dic = {'x':100, 'y':200, 'z':300}
 print('x' in dic)
 print('a' in dic)
 
 # 出力
 True
 False



辞書のコピー

辞書をコピーするには、代入演算子で代入する方法とcopy関数を使用する方法がある。
ただし、これはリストのコピーの時と同様に、値渡しと参照渡しの違いがあるので注意が必要である。

代入演算子でコピーする(参照渡し)
 dic1 = {'x':100, 'y':200, 'z':300}
 dic2 = d1
 dic2['x'] = 500
 print(dic1)
 print(dic2)
 
 # 出力
 {'x' : 500, 'y' : 200, 'z' : 300}
 {'x' : 500, 'y' : 200, 'z' : 300}



copy関数でコピーする(値渡し)

全く独立した別の辞書として扱えるようするには、copy関数を使用する。

 dic1 = {'x':100, 'y':200, 'z':300}
 dic2 = d1.copy()
 dic2['x'] = 500
 
 # 出力
 {'x' : 100, 'y' : 200, 'z' : 300}
 {'x' : 500, 'y' : 200, 'z' : 300}