Pythonで、辞書(dict)の内容を列挙して扱う方法(keys, values, items)について解説します。
Contents
辞書(dict)の内容を列挙する
Pythonプログラミングで辞書(dict)を使用する際には、キーや値の情報を取り出して活用したくなるケースがよくあります。
辞書では、key、values、itemsといったメソッドを使用することで辞書におけるキーや値の情報を取り出すことが可能です。また、これらのメソッドはイテラブル(iterable)なオブジェクトを返却するため、for文でよく利用されます。
本記事では、まず各メソッドの使い方の基本とfor文で各メソッドの返却値を扱う方法を例を使って紹介します。
イテラブル(iterable)とは、forで繰り返し可能なことを言います。イテラブルな型としてはリスト、タプル、辞書、集合といったものが代表的なものになります。
辞書(dict)の内容を列挙するビューを作成する方法 ~ keys, values, items ~
キーを列挙するビューを作成する ~ keysメソッド ~
辞書のキーを列挙するビューを作成するには、以下のようにkeysメソッドを使用します。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # keys()でキーのビューを取得する key_v = d.keys() print(type(key_v)) print(f"key_v: {key_v}")
【実行結果】 <class 'dict_keys'> key_v: dict_keys(['k1', 'k2', 'k3', 'k4', 'k5'])
keysメソッドの返却値を確認すると辞書のキーの部分を列挙してとってきていることが分かります。
また、keysメソッドの返却値の型はdict_keysクラスのオブジェクトです。このdict_keysクラスのオブジェクトはイテラブルなオブジェクトなので、for文のinに指定して繰り返すことができます。
keysメソッドを使用して、キーに対してfor文を実行する方法
keysメソッドを用いてキーに対してfor文を実行するには以下のように使用します。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # for文で値を扱う for key in d.keys(): print(f"key: {key}")
【実行結果】 key: k1 key: k2 key: k3 key: k4 key: k5
値を列挙するビューを作成する ~ valuesメソッド~
辞書の値を列挙するビューを作成するには、以下のようにvaluesメソッドを使用します。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # values()で値のビューを取得する val_v = d.values() print(type(val_v)) print(f"val_v: {val_v}")
【実行結果】 <class 'dict_values'> val_v: dict_values([10, 20, 30, 40, 50])
valuesメソッドの返却値を確認すると辞書の値の部分を列挙してとってきていることが分かります。
また、valuesメソッドの返却値の型はdict_valuesクラスのオブジェクトです。このdict_valuesクラスのオブジェクトはイテラブルなオブジェクトなので、for文のinに指定して繰り返すことができます。
valuesメソッドを使用して、値に対してfor文を実行する方法
valuesメソッドを用いて値に対してfor文を実行するには以下のように使用します。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # for文で値を扱う for value in d.values(): print(f"value: {value}")
【実行結果】 value: 10 value: 20 value: 30 value: 40 value: 50
要素を列挙するビューを作成する ~ itemsメソッド ~
辞書の要素(キー, 値)を列挙するビューを作成するには、以下のようにitemsメソッドを使用します。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # items()で要素のビューを取得する itm_v = d.items() print(type(itm_v)) print(f"itm_v: {itm_v}")
【実行結果】 <class 'dict_items'> itm_v: dict_items([('k1', 10), ('k2', 20), ('k3', 30), ('k4', 40), ('k5', 50)])
itemsメソッドの返却値を確認すると辞書のキーと値のペアをを列挙してとってきていることが分かります。
また、itemsメソッドの返却値の型はdict_itemsクラスのオブジェクトです。このdict_itemsクラスのオブジェクトはイテラブルなオブジェクトなので、for文のinに指定して繰り返すことができます。
itemsメソッドを使用して、要素に対してfor文を実行する方法
itemsメソッドをfor文で扱う場合には、「キーと値それぞれを取得して使う方法」と「tubple(タプル)で要素を受け取って使用する方法」があるのでそれぞれ例を使ってみてみましょう。
キーと値それぞれを取得して使う方法
itemsメソッドを用いて要素(キー、値)に対してfor文を実行するには以下のようにします。itemsメソッドの返却値のオブジェクトは、タプルを列挙しているものなので、keyとvalueにアンパック代入されて使用されているということになります。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # for文で要素(キー、値)を扱う for key, value in d.items(): print(f"key: {key}, value: {value}")
【実行結果】 key: k1, value: 10 key: k2, value: 20 key: k3, value: 30 key: k4, value: 40 key: k5, value: 50
tuple(タプル)で要素を受け取って使用する方法
itemsメソッドの返却値のオブジェクトは、タプルを列挙したものであるため、以下のようにタプルとして受け取って扱うことも可能です。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # for文で要素(キー、値)をタプルとして受け取って扱う for tpl in d.items(): print(f"key: {tpl[0]}, value: {tpl[1]}")
【実行結果】 key: k1, value: 10 key: k2, value: 20 key: k3, value: 30 key: k4, value: 40 key: k5, value: 50
keys、values、itemsのビューとしての特徴
keysメソッド、valuesメソッド、itemsメソッドが返却するのは、該当辞書のコピーではなく「ビュー」となっていることに注意しましょう。
「ビュー」というその名の通り、元データを見るためのものです。つまり、元データが変化するとビューとして取得したものの情報も変わるため注意してください。
実際に以下の例で見てみましょう。
d = {"k1": 10, "k2": 20, "k3": 30, "k4": 40, "k5": 50} # items()で要素のビューを取得する itm_v = d.items() print(f"itm_v: {itm_v}") # 元の辞書にデータを追加する。 d["k6"] = 60 # データ追加前に作成したビューを確認してみる。 print(f"itm_v: {itm_v}")
【実行結果】 itm_v: dict_items([('k1', 10), ('k2', 20), ('k3', 30), ('k4', 40), ('k5', 50)]) itm_v: dict_items([('k1', 10), ('k2', 20), ('k3', 30), ('k4', 40), ('k5', 50), ('k6', 60)])
上記例では、items()でビューとして取得した後に元の辞書にデータを追加しています。
その後、再度items()で取得しなおすということはしてはいないのですが、itm_vをprintしてみると追加した要素が増えていることが分かります。
まとめ
Pythonで、辞書(dict)の内容を列挙して扱う方法について解説しました。
辞書では、key、values、itemsといったメソッドを使用することで辞書におけるキーや値の情報を取り出すことができることを紹介しました。また、これらのメソッドはイテラブル(iterable)なオブジェクトを返却するため、for文で使用することができます。
なお、上記のkey、values、itemsの返却値はコピーではなくビューであるため、元のデータが変更されるとビューの結果も変化しますので注意しましょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。