PythonのOrderedDict(順序付き辞書)とは?特徴と使い方を解説
OrderedDictとは何か
collections.OrderedDictは、Python標準ライブラリが提供する辞書(dict)のサブクラスで、要素を追加した順序(挿入順)を記憶するのが最大の特徴です。通常の辞書と同じメソッド(get()、keys()、values()、items()など)をそのまま使えるため、既存のコードにも容易に組み込めます。
重要な挙動として、次の2点を押さえておきましょう。
- 既存のキーに新しい値を上書き代入しても、そのキーの元の挿入位置は変わらない
- 一度キーを削除してから再度追加すると、そのキーは末尾に移動する
基本的な使い方
まずは、通常の辞書からOrderedDictを作成し、挿入順がどのように保持されるかを見てみましょう。
>>> from collections import OrderedDict
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'mango': 2}
>>> od = OrderedDict(d.items())
>>> od
OrderedDict([('banana', 3), ('apple', 4), ('pear', 1), ('mango', 2)])
このように、渡した順序のまま要素が保持されます。
ソートした状態でOrderedDictを作成する
sorted()と組み合わせれば、キー順に並べ替えたOrderedDictを簡単に作成できます。
>>> od = OrderedDict(sorted(d.items()))
>>> od
OrderedDict([('apple', 4), ('banana', 3), ('mango', 2), ('pear', 1)])
popitem()で要素を取り出す
popitem()メソッドを使うと、末尾の要素を取り出しながら削除できます。戻り値は「(キー, 値)」のタプルです。
>>> od = OrderedDict(sorted(d.items()))
>>> t = od.popitem()
>>> t
('pear', 1)
上の例では、キー順に並べた辞書の最後にある'pear'が取り出されました。一方、挿入順のままのOrderedDictに対して実行すると、結果は異なります。
>>> od = OrderedDict(d.items())
>>> t = od.popitem()
>>> t
('mango', 2)
こちらでは、元の挿入順で最後に追加された'mango'が取り出されています。なお、popitem(last=False)と引数を指定すれば、先頭の要素を取り出すことも可能です。
通常のdictとの違い
Python 3.7以降、通常のdictも挿入順を保持する仕様になったため、「順序を覚えておく」という点だけなら両者に大きな差はありません。ただし、OrderedDictには以下のような独自の機能があります。
move_to_end(key): 指定したキーを先頭または末尾へ移動できるpopitem(last=False): 先頭から要素を取り出せる(通常のdictは常に末尾)- 等価比較(
==)において順序も考慮される(通常のdictは順序を無視して比較)
順序そのものに意味を持たせたい処理や、FIFOキュー的な使い方、順序を含めた厳密な比較が必要な場面では、OrderedDictを選ぶとよいでしょう。
-
Pythonのデフォルト引数とは?基本的な使い方をサンプルコードで解説
Pythonでは、関数の引数にデフォルト値(初期値)を設定できます。関数を呼び出す際にその引数が省略された場合、自動的にデフォルト値が適用される仕組みです。 デフォルト引数の基本 Pythonは、関数引数の構文やデフォルト値の扱い方において、他のプログラミング言語とは少し異なる独自のアプローチを採用しています。デフォルト値とは、関数呼び出し時に引数の値が渡されなかった場合に、その引数が取る値のことです。 デフォルト値は、代入演算子(=)を使って設定します。以下がデフォルト引数の典型的な構文です。この例では、foo パラメータに Come here! というデフォルト値が設定されています。 de
-
Pythonの関数属性とは?getattr・setattrを使った属性の設定と取得方法を解説
Pythonでは「すべてがオブジェクト」という設計思想のもと、ほぼすべてのデータに属性やメソッドが備わっています。実は関数もオブジェクトであり、他のオブジェクトと同じように属性(アトリビュート)を持つことができます。すべての関数には、組み込み属性として __doc__ が用意されています。これは関数のソースコード内に定義されたドキュメント文字列(docstring)を返す属性です。さらに、Pythonでは既存の属性を参照するだけでなく、関数に対して新しい属性を自由に追加し、後からその値を取得することも可能です。属性を操作するための組み込み関数:getattr と setattr属性の扱いには、