この記事では、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以前では辞書は順序を保持しないことに注意しましょう。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ