ここではPythonの辞書型について扱っていきます。ディクショナリとも呼ばれいますが、これも複数のデータ型を管理することができます。
他のプログラミング言語では連想配列と呼ばれるものに当たりますね。
辞書型の特徴としては、要素を格納する時に、リストでのインデックスと違って、キー(Key)を使って管理するところでしょう。
Pythonの辞書型は要素の順番をこれまでは保持することができませんでしたが、Python3.7から辞書データの順番が保持される仕様となっているようです。
では、辞書型を定義するところから始めていきましょう。
辞書型を定義する
Pythonの辞書型は、複数の要素を波括弧{}で括ります。要素は、キー(Key)と値(Value)を対応させてコロン(:)で結びつけ、カンマ(,)で区切って格納します。
辞書 = {キー1:値1, キー2:値2, キー3:値3, キー4:値4, …}という形になります。
具体的にはこういう形になります。
d = {"x":100, "y":200, "z":300}
対話型シェルで見てみるとこうなります。
type()で確認すると、辞書型であるのがわかります。
キーには数値や文字列などを使うことができますが、リストなどの要素を変更できるものは使うことができません。
辞書の操作
ではPythonの辞書型のデータを操作してみましょう。
辞書型はキーでそれぞれの値を取り出すことができます。
辞書型を代入した変数に続けて角括弧でキーを指定します。
次の例でやってみましょう。
d = {"x":100, "y":200}
d["x"]
d["y"]
対話型シェルで実行してみます。
指定したキーで値が取り出せているのがわかります。
次はキーを指定して値を書き換えてみましょう。
d = {"x":100, "y":200}
d["x"] = 300
キーを指定して、新しい値を代入するコードです。
実行してみるとこうなります。
キーで指定した値が変更されているのがわかりますね。
次は新たにデータを辞書の追加する操作です。
d = {"x":100, "y":200}
d["z"] = 300
d[10] = 400
新しいキーを指定して、新しい要素を代入します。文字列のキーと数値のキーの両方でやってみます。
コードを実行するとこうなります。
それぞれ、新しいキーで新しい値が辞書に格納されました。
dict()で辞書に変換する
辞書は文字列やタプル、リストを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')
これらを次のようにdict()に入れて変換します。
dict(list_of_list)
dict(list_of_tuple)
dict(tuple_of_list)
dict(list_of_string)
dict(tuple_of_string)
Atomで実行してみましょう。dict()をprintで出力しています。
全て、辞書型に変換されているのがわかりますね。
また、dict()へ変数に値を代入したものを入れても辞書が作れます。
dict(x=100, y=200, z=300)
実行すると、辞書型になっているのがわかります。
辞書のメソッド
Pythonの辞書型にもいろんなメソッドがあります。ここでは代表的なものをみていきましょう。
keys()とvalues()で全てのキーと値を取得する
まずkeys()とvalues()を使ってみましょう。これはそれぞれキーの全て、値の全てを取得するのに使います。
辞書.keys()、辞書.values()の形で利用します。
辞書型データを用意してやってみましょう。
d = {'x':100, 'y':200}
d.keys()
d.values()
Pythonシェルで実行してみるとこうなります。
それぞれ、全てのキーと全ての値が取り出されているのがわかりますね。
update()で辞書を結合する
update()を使うと、2つの異なる辞書型データを結合することができます。キーが同じ場合は新しい値に更新します。
辞書1.update(辞書2)の形で利用します。辞書1が更新されることになります。
2つ辞書データを用意して、update()で結合してみましょう。
d1 = {'l':10, 'm':200, 'n':300}
d2 = {'l':100, 'o':400}
d1.update(d2)
2つの辞書データの違いがわかりますね。一つはキーが同じで値が違います。もう一つは新しいキーと値がセットされています。このd1をd2でupdateします。
実行してみるとこうなります。
この場合、d1のxの値が変更され、oの値が追加されているのがわかりますね。
get()で値を取得する
辞書は角括弧にキーを指定することで値を取得することができましたが、get()を使っても同様のことができます。
辞書.get(キー)の形で取得できます。
d = {'x':10, 'y':20}
d.get('x') # d['x']と同じ操作
実行してみるとこうなります。
キーの値を取り出すことができているのがわかります。
辞書に無いキーをしてするとどうなるでしょうか? 続けて実行してみましょう。
辞書にないキーのzを指定しましたが、get()では何も返されず、角括弧で指定した場合はエラーが出ました。キーに値が入って無いということになります。
type()でget()の値を調べてみると、NoneTypeということで値が無いことがわかります。
pop()で取り出す
get()と似たようなメソッドでpop()があります。これもキーを指定して値を取得するのですが、辞書からキーで指定した値を抜いてしまうという特徴があります。get()は辞書を変更しません。
辞書.pop(キー)の形で使います。
試してみましょう。
d = {'x':100, 'y':200, 'z':300}
d.pop('x')
このコードを実行してみます。
指定したキーの値が取り出されて、辞書自体もキーの値が無くなっているのがわかりますね。
delで削除する
pop()を使うとそのキーの値を取り出して辞書からは削除されましたが、delを使うと同じ削除ができます。
先ほどに続けてやってみましょう。
del d['y']
また、キーを指定せずに使ってみるとどうなるでしょうか。
del d
これらを続けて実行してみましょう。
キーを指定して辞書から削除ができています。指定しない場合は辞書自体が削除されて、辞書が表示できずにエラーになっているのがわかります。
clear()で値を削除する
delを使うと辞書自体の定義が無くなってしまいますが、clear()を使うと値だけを削除してくれて、空の辞書が残り辞書自体の操作を続けることができます。
辞書.clear()の形で使うことができます。
コード例で試してみましょう。再度、辞書を定義し直します。
d = {'x':100, 'y':200, 'z':300}
d.clear()
これを実行するとどうなるか。
値のみが削除され、空の辞書が残っているのがわかります。
inでキーの有無を調べる
辞書に指定するキーがあるかどうかを調べるには、inを使います。
‘キー’ in 辞書、の形で調べることができます。
d = {'x':100, 'y':200, 'z':300}
'x' in d
'a' in d
辞書にキーx、aが含まれるかどうか調べるコードです。
これを実行してみましょう。
辞書にキーxは入っているのでTrue、aは無いのでFalseが返されているのがわかります。
辞書のコピー
辞書をコピーするには、イコール(=)で代入する方法とcopy()を使う方法があります。ただし、これはリストのコピーの時と同じように参照渡しかどうかの違いがあるので注意が必要です。
代入(=)を使ってコピーする
まずはイコール(=)を使って、辞書を他の変数に代入してみます。
d1 = {'x':100, 'y':200, 'z':300}
d2 = d1
実行してみましょう。
どちらの辞書も同じ値になっているのがわかります。
では、d2の辞書の値を次のように変更してみましょう。
d2['x'] = 500
続けて実行してみるとこうなります。
d2のxの値だけ変更したのですが、d1も一緒に変わってしまっています。
これはリストでやった時と同じように、どちらもメモリ内の同じところに格納されている同一のデータを参照しているからで、こういう結果になるというわけです。
copy()を使ってコピーする
全く独立した別の辞書として扱えるようにコピーするにはcopy()を使うことでできます。
辞書.copy()の形で使います。
上と同じ作業をcopy()を使えばこのようなコードになります。
d1 = {'x':100, 'y':200, 'z':300}
d2 = d1.copy()
d2['x'] = 500
コピーした後に値を変更して実行してみます。
copy()で実行するとどちらの辞書も同じ値になっています。d2の値を変えると、イコール(=)でのコピーではどちらの辞書も変わっていましたが、この場合は変更した辞書のd2だけが変わっています。
このようにcopy()を使えば、独立した別の辞書として複製できるわけです。
まとめ
Pythonの辞書型(ディクショナリ)は、要素を格納する時に、リストでのインデックスと違って、キー(Key)を使い値をコロン(:)でセットにして管理します。要素はカンマ(,)で区切って波括弧{}で全体を括ります。
辞書の操作にはキーを指定して取り出したり、削除したりします。
辞書にも様々なメソッドがあり、ここでは代表的なものを扱ってみました。
辞書のコピーに関してはリストのコピーと同じように参照渡しのものとそうで無いものとで操作の違いがあります。