この記事では、Pyhtonで順序付き辞書を扱う方法を解説します。
Python 3.7以前のバージョンでは辞書は順序を保持しなかったので順序を扱いたい場合はcollectionsモジュールのOrderedDict()クラスを使っていました。
しかし、以下のような点が通常の辞書よりも順序付き辞書の方が優れています。
- 通常の辞書よりも並び替えが得意
- popitemメソッドでLIFOかFIFOかを指定できる
- 要素を末尾に置き換えるmove_to_endメソッドが使える
それでは、順序付き辞書について見ていきましょう!
順序付き辞書の使い方
順序付き辞書は、collectionsモジュールのOrderedDict()クラスを使います。collectionsモジュールは、標準ライブラリなのでインポートするだけで使用可能です。
※ Python 3.1で追加。
import collections collections.OrderedDict([items])
OrderedDict()クラスは、辞書のサブクラスなので辞書と同様の処理やメソッドが使える。
import collections od = collections.OrderedDict() od['one'] = 1 od['two'] = 2 od['three'] = 3 print(od.values()) # odict_values([1, 2, 3]) print(od.get('one')) # 1
基本的には通常の辞書と使い方は変わりません。
順序付き辞書の等価判定
順序付き辞書同士を等価判定する際には順序が影響します。list(od1.items())==list(od2.items())というように判定されます。
import collections od1 = collections.OrderedDict() od1['one'] = 1 od1['two'] = 2 od1['three'] = 3 od2 = collections.OrderedDict() od2['one'] = 1 od2['three'] = 3 od2['two'] = 2 print(od1 == od2) # False od3 = collections.OrderedDict() od3['one'] = 1 od3['two'] = 2 od3['three'] = 3 print(od1 == od3) # True
順序付き辞書と通常の辞書と比較する場合は、順序は影響しません。
import collections od1 = collections.OrderedDict() od1['one'] = 1 od1['two'] = 2 od1['three'] = 3 d = dict() d['one'] = 1 d['three'] = 3 d['two'] = 2 print(od1 == d) # True
順序付き辞書は格納されている要素が完全に一致していても挿入順序が違えばFalseとして認識されてしまうので注意が必要です。
popitemメソッドでFIFOが可能
辞書のpopitem()メソッドはLIFO(後入れ先出し)で要素を取得しますが、順序付き辞書のpopitem()メソッドではlast引数によってLIFOかFIFO(先入れ先出し)かを指定できます。
popitem(last=True)
last引数がTrueの場合LIFO、Falseの場合FIFOで要素を取得します。
import collections od = collections.OrderedDict() od['one'] = 1 od['two'] = 2 od['three'] = 3 # LIFO(後入れ先出し) print(od.popitem()) # ('three', 3) # FIFO(先入れ先出し) print(od.popitem(False)) # ('one', 1)
要素を先頭や末尾に移動
move_to_endメソッドを使うことで要素を先頭や末尾に移動することができます。
move_to_end(key, last=True)
key引数に指定された要素を末尾に移動します。
import collections od = collections.OrderedDict() od['one'] = 1 od['two'] = 2 od['three'] = 3 od.move_to_end('one') print(od.items()) # odict_items([('two', 2), ('three', 3), ('one', 1)])
last引数がFalseの場合は先頭に移動します。
od.move_to_end('three', False) print(od.items()) # odict_items([('three', 3), ('two', 2), ('one', 1)])
まとめ
この記事では、Pythonの順序付き辞書であるcollections.OrderedDict()の使い方について解説しました。
アップデートによりほとんど使う機会はなくなってしまいましたが、逆にバージョン3.7以前では辞書は順序を保持しないことに注意しましょう。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
- collections --- コンテナデータ型 — Python ドキュメント


