Pythonの辞書に追加された要素の挿入順序を維持するOrderedDict

Pythonの辞書に追加された要素の挿入順序を維持するOrderedDictについて解説しています。

OrderedDictは、辞書に追加された要素(値)の挿入順序を維持することができます。項目の順序は、イテレートやシリアライズの際にも保持されます。項目の順序は、イテレートやシリアライズ(直列化)の際にも保持されます。これは、Pythonの通常の辞書とは少し異なります。

■Python

Google Colaboratory(Google Colab),Python3.7.10

■PythonでOrderedDictを定義する

では、早速PythonでOrderedDictを定義してみます。

■コード

from collections import OrderedDict
d = OrderedDict()

d['a'] = 2
d['e'] = 1
d['c'] = 4
d['b'] = 3
d['d'] = 5

PythonでOrdedDictを定義するには、インポートで、OrdedDictのcollectionsを呼び出します。

その後に、dという変数を作成し、その中にOrderedDict()関数を使用します。そして格納します。

格納後、dという辞書に追加する、キーと要素(値)のペアを、角括弧”[]”とイコール”=”を使用し、追加します。これで、辞書に追加された要素(値)の挿入順序を維持されます。

■コード

from collections import OrderedDict
d = OrderedDict()

d['a'] = 2
d['e'] = 1
d['c'] = 4
d['b'] = 3
d['d'] = 5

for key,value in d.items():
print(key,value)

辞書に追加された要素(値)の挿入順序が維持されているを確認するために、for文を使用し、dという辞書内にあるキーと要素(値)を全てprint()関数で出力します。

■実行

このスクリプトを実行してみます。

実行してみると、dという辞書に追加したキーと要素(値)のペアがprint()関数を使用したことで、出力されました。出力されたキーと要素(値)のペアを確認すると、挿入順序が維持されていることが確認できました。

確認後、通常の辞書と、どのように違うのか比較したかったのですが、Pythonのバージョン3.7(https://mail.python.org/pipermail/python-dev/2017-December/151283.html)から(非公式にはバージョン3.6から)、通常の辞書を作成した場合でも、追加された要素の挿入順序が維持されるようになりました。

通常の辞書を作成した場合でも、追加された要素の挿入順序が維持されるようになりましたが、OrderedDictが無駄になるのかといえばそうではありません。OrderedDictは単に挿入順を保持する辞書だけでなく、挿入順に依存するmove_to_end()関数(要素を先頭または末尾に移動)を提供し、reversed()関数(要素を逆順に並べ替える)の反復もサポートしています。

さらに、OrderedDictでの等値比較(2つの値が等しいかどうか判定する)は順序を気にしますが、Pythonの通常の辞書を作成した場合では、そのようなことはありません。

例えば、上記のような場合、OrderedDictを使用した辞書を2つを用意し、それぞれの辞書内の挿入順序を変更します。変更後「==(比較演算子)」を使用してみると、OrderedDictの場合ではFalse(偽)と出力されます。つまり、この2つの辞書では同じではないです。

一方、Pythonの通常の辞書を作成し、同じようにそれぞれの辞書内の挿入順序を変更します。変更後、変更後「==(比較演算子)」を使用してみると、この場合ではTrue(真)と出力されます。つまり、この2つの辞書は同じであると判定されます。

コメント

タイトルとURLをコピーしました