辞書はソフトウェア開発において最もよく使われるデータ構造の1つですが、これには 十分な理由があります。その理由は、データをキーと値のペアできちんと格納できるため、平均して O(1)
時間でデータにアクセスできるようになるためです。
辞書を使用する際には、それをどのように反復処理するかを知っておくことが重要です。保存したデータを復元できないのでは、実質的に意味がありません。
この記事では、様々な種類のイテレータと for
ループを使用して Python 辞書を反復処理する方法を紹介します。
キー()メソッドの使用
Python の辞書には、 keys()
という便利なメソッドがあり、これを使うと初期化されたすべてのキーを簡単に反復処理することができます。
Python 3以降、このメソッドはリストを返さず、代わりにビューオブジェクトを返すことを覚えておいてください。ビューオブジェクトはその名の通り、あるデータのビューです。
つまり、そのデータを反復処理することは問題ありませんが、キーのリストを実際に保存したいのであれば、それを実体化する必要があります。これは、提供されたビューオブジェクトを list
コンストラクタに転送することで簡単に行うことができます。
それでは、どのように動作するのか見ていきましょう。
my_dict = {'alpha': 5, 'beta': 4, 'gamma': 3}
# Here we're just 'looking' at the keys,
# we're not actually constructing a list
# out of them
key_view = my_dict.keys()
print("Key view:", key_view)
print("Type:", type(key_view),end="
")
# Here we're materializing the keys
# into a list ofo keys
key_list = list(my_dict.keys())
print("Key list:", key_list)
print("Type: ", type(key_list),end="
")
# And as we can see, view can be easily be
# used for iterating over a dictionary
for key in my_dict.keys():
print(key, ':', my_dict[key])
このコードを実行すると、次のような出力が得られます。
Key view: dict_keys(['alpha', 'beta', 'gamma'])
Type: <class 'dict_keys'=""
Key list: ['alpha', 'beta', 'gamma']
Type: <class 'list'=""
alpha : 5
beta : 4
gamma : 3
別の方法として、次のようにすることもできます。
my_dict = {'alpha': 5, 'beta': 4, 'gamma': 3}
for key in my_dict:
print(key, ':', my_dict[key])
キーワード in
を辞書と組み合わせて使用すると、辞書はその __iter__()
メソッドを呼び出します。このメソッドはイテレータを返し、このイテレータは与えられた辞書のキーを暗黙のうちに調べていくのに使われます。
values() メソッドの使用法
keys()メソッドと同様に
values()` メソッドもビューオブジェクトを返しますが、キーを順に並べるのではなく、値を順に並べます。
my_dict = {'alpha': 5, 'beta': 4, 'gamma': 3}
# Inspecting the view of the values
# in the dictionary
key_list = list(my_dict.values())
print("Value list:", key_list)
print("Type: ", type(key_list), end="
")
for value in my_dict.values():
print(value, end=" ")
このコードを実行すると、次のような出力が得られます。
Value list: [5, 4, 3]
Type: <class 'list'=""
5 4 3
前のメソッドとは異なり、このメソッドは値のみを提供します。キーにこだわらない場合に便利です。
items() メソッドを使用する
しかし、単に keys
や values
を反復処理するのではなく、 (key,value)
のペアを反復処理します。
それでは、その仕組みを見ていきましょう。
my_dict = {'alpha': 5, 'beta': 4, 'gamma': 3}
# Inspecting the view of the (key,value) pairs
key_list = list(my_dict.items())
print("(key,value) pair list:", key_list)
print("Type: ", type(key_list), end="
")
for item in my_dict.items():
print(item, end=" ")
このコードを実行すると、次のような出力が得られます。
(key,value) pair list: [('alpha', 5), ('beta', 4), ('gamma', 3)]
Type: <class 'list'=""
('alpha', 5) ('beta', 4) ('gamma', 3)
キーと値を同時に即座に割り当てるには、タプルのアンパッキングを使って、タプルの各値に変数を使用してそれらを抽出することができます。
for key, value in my_dict.items():
print(key,':',value)
Python 2の古いバージョンでは、 items()
, keys()
, values()
は辞書からデータのコピーを返していたことに注意することが重要です。一方、Python 3 では、これらのオブジェクトはビューオブジェクトを返します。
これらは動的なビューを提供し、さらに元の辞書に変更があった場合、すぐにビューオブジェクトに反映されるため、より効果的です(逆もまた然り)。
結論
この記事では、Pythonの辞書を繰り返し処理するさまざまな方法について説明しました。これには keys()
, values()
, items()
メソッドと、 for
ループが含まれます。
</strong