An Embedded Engineer’s Blog

とある組み込みエンジニアの備忘録的なブログです。

Python学習メモ - その8

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はディクショナリ(Dictionary)についてです。


ディクショナリ(Dictionary)

ディクショナリはユニーク(一意)なキーとそれに対応する値を格納するコレクションです。
例えば、IDとそれに対応する顧客名など、重複する可能性のある値(顧客名)を別の重複しないキー(ID)で管理したい場合などに使用します。


ディクショナリ(単一型)

ディクショナリはキーと値のセット(要素)をコロン(:)で表し、複数の要素をカンマ( , )で区切り、前後に中かっこ「{ }」をつけることでディクショナリとして認識されます。

dict_values = {"A": 1, "B": 2, "C": 3, "D": 4}
print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3, 'D': 4}


ディクショナリ(複数型)

一意の値であれば、異なる型のデータをキーに使用することができます。
また、キーに対する値にも異なる型を格納することができます。

dict_values = {"A": 1, "B": 3.14, 3.5: (1 + 2j), "4": 4}
print(dict_values)

実行結果

{'A': 1, 'B': 3.14, 3.5: (1+2j), '4': 4}


重複定義

ディクショナリの定義時に、重複したキーで初期化した場合、最後にセットされたキーの値が有効となります(最後の値で上書きされる)。

dict_values = {"A": 1, "B": 2, "C": 3, "D": 4, "A": 5}
print(dict_values)

実行結果

{'A': 5, 'B': 2, 'C': 3, 'D': 4}


値の取得(エラーあり)

ディクショナリに対して、キーを指定することで値を取得することができます。
この方法では、存在しないキーを指定すると実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
print(dict_values["A"])
print(dict_values["B"])
print(dict_values["C"])
# print(dict_values["D"])  # 実行エラー

実行結果

{'A': 1, 'B': 2, 'C': 3}
1
2
3


値の取得(エラーなし or デフォルト値)

getメソッドを使用することでも、キーを指定した値の取得が可能です。
この場合、存在しないキーを指定するとNoneが返されます。
また、存在しないキーを指定した場合に返されるデフォルト値を指定することもできます。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
print(dict_values.get("A"))
print(dict_values.get("B"))
print(dict_values.get("C"))
print(dict_values.get("D"))
print(dict_values.get("D", "Unknown Key"))

実行結果

{'A': 1, 'B': 2, 'C': 3}
1
2
3
None
Unknown Key


値の変更

キーを指定して、値を格納することで、値を変更することができます。

dict_values = {"A": 1, "B": 2, "C": 3}
print(dict_values)
dict_values["B"] = 4
print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 4, 'C': 3}


空ディクショナリ

空(要素数0)のディクショナリを作成したい場合には、「{}」のみを記述します。

dict_values = {}
print(dict_values)

実行結果

{}


追加

存在しないキーを指定して、値を格納することで要素を追加することができます。

dict_values = {}
dict_values["A"] = 1
dict_values["B"] = 2
dict_values["C"] = 3

print(dict_values)

実行結果

{'A': 1, 'B': 2, 'C': 3}


値の削除

キーを指定してdel演算子を使用することで指定したキーの要素を削除することができます。

dict_values = {"A": 1, "B": 2, "C": 3}

del dict_values["B"]

print(dict_values)

実行結果

{'A': 1, 'C': 3}


値の取り出し(キー指定)

popメソッドを使用することで、指定したキーに対応する値を取り出し(取得 & 削除)することができます。
また、存在しないキーを指定した場合に返されるデフォルト値を指定することもできます。
デフォルト値を指定しないで存在しないキーを指定した場合は、実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}

pop_value = dict_values.pop("B")
print(pop_value)

pop_value = dict_values.pop("D", "Not Found")
print(pop_value)

# pop_value = dict_values.pop("D")  # 実行エラー

print(dict_values)

実行結果

2
Not Found
{'A': 1, 'C': 3}


キー&値の取り出し

popitemメソッドを使用することで、最後に追加された要素から順番に要素(キー&値)を取り出し(取得&削除)することができます。
空のディクショナリに対してpopitemメソッドを使用すると実行エラーとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
pop_value = dict_values.popitem()
print(pop_value)
pop_value = dict_values.popitem()
print(pop_value)
pop_value = dict_values.popitem()
print(pop_value)
# pop_value = dict_values.popitem() # 実行エラー

実行結果

('C', 3)
('B', 2)
('A', 1)


クリア

ディクショナリをクリアする場合には、clearメソッドを使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
dict_values.clear()
print(dict_values)

実行結果

{}


デフォルト指定セット

setdefaultメソッドを指定すると、以下のような処理を行うことができます。
1. すでに存在するキーを指定した場合は、そのキーに対応する値を返す 2. 存在しないキーとデフォルト値を指定した場合は、そのキーとデフォルト値で要素を追加する 3. 存在しないキーのみを指定した場合は、そのキーとNoneで要素を追加する

dict_values = {"A": 1, "B": 2, "C": 3}
set_value = dict_values.setdefault("A", 4)
print(set_value)
set_value = dict_values.setdefault("D", 4)
print(set_value)
set_value = dict_values.setdefault("E")
print(set_value)
print(dict_values)

実行結果

1
4
None
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': None}


更新

updateメソッドを使用することで、ディクショナリを更新することができます。
複数の要素を一気に変更したい場合に便利です。

dict_values = {"A": 1, "B": 2, "C": 3}
dict_values.update([("B", 4), ("D", 4)])
dict_values.update(D=5, E=6)
print(dict_values)

実行結果

{'A': 1, 'B': 4, 'C': 3, 'D': 5, 'E': 6}


全要素数取得

ディクショナリ全体の要素数を取得したい場合はlen関数を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print(len(dict_values))

実行結果

3


コピー

ディクショナリの複製を作成したい場合は、copyメソッドを使用します。

src_dict_values = {"A": 1, "B": 2, "C": 3}
dst_dict_values1 = src_dict_values
dst_dict_values2 = src_dict_values.copy()

print(src_dict_values)
print(dst_dict_values1)
print(dst_dict_values2)

print()

src_dict_values["B"] = 4
dst_dict_values2["D"] = 4

print(src_dict_values)
print(dst_dict_values1)
print(dst_dict_values2)

実行結果

{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 2, 'C': 3}
{'A': 1, 'B': 2, 'C': 3}

{'A': 1, 'B': 4, 'C': 3}
{'A': 1, 'B': 4, 'C': 3}
{'A': 1, 'B': 2, 'C': 3, 'D': 4}


キーの存在確認

ディクショナリ内に特定のキーを持つ要素が存在しているかを確認する場合には、in演算子を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print("B" in dict_values)

実行結果

True


逆に、ディクショナリの中に特定のキーを持つ要素が含まれていないことを確認したい場合は、not in 演算子を使用します。

dict_values = {"A": 1, "B": 2, "C": 3}
print("D" not in dict_values)

実行結果

True


キー一覧(View Object)の取得

ディクショナリに格納されている要素のキー一覧を取得したい場合は、keysメソッドを使用します。
keysメソッドから返されるオブジェクトはView Objectとなります。
View Objectは動的なビューを提供し、ディクショナリの要素が変更された場合にその変更内容が自動的に反映されます。

dict_values = {"A": 1, "B": 2, "C": 3}
keys = dict_values.keys()
print(keys)
dict_values["D"] = 4
print(keys)
print(list(keys))

実行結果

dict_keys(['A', 'B', 'C'])
dict_keys(['A', 'B', 'C', 'D'])
['A', 'B', 'C', 'D']


値一覧(View Object)の取得

ディクショナリに格納されている要素の値一覧を取得したい場合は、valuesメソッドを使用します。
valuesメソッドから返されるオブジェクトもkeysメソッドと同様View Objectとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
values = dict_values.values()
print(values)
dict_values["D"] = 4
print(values)
print(list(values))

実行結果

dict_values([1, 2, 3])
dict_values([1, 2, 3, 4])
[1, 2, 3, 4]


要素一覧(View Object)の取得

ディクショナリに格納されている要素一覧を取得したい場合は、itemsメソッドを使用します。
itemsメソッドから返されるオブジェクトもkeysメソッドやvaluesメソッドと同様View Objectとなります。

dict_values = {"A": 1, "B": 2, "C": 3}
items = dict_values.items()
print(items)
dict_values["D"] = 4
print(items)
print(list(items))

実行結果

dict_items([('A', 1), ('B', 2), ('C', 3)])
dict_items([('A', 1), ('B', 2), ('C', 3), ('D', 4)])
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)