Python PR

【Python】順序付き辞書であるOrderedDictの使い方

記事内に商品プロモーションを含む場合があります

この記事では、Pyhtonで順序付き辞書を扱う方法を解説します。

Python 3.7以前のバージョンでは辞書は順序を保持しなかったので順序を扱いたい場合はcollectionsモジュールのOrderedDict()クラスを使っていました。

Python 3.7から辞書が挿入順序を記憶するようになり、Python 3.8から__reversed__メソッドも追加されたため逆順も取得できるようになり、順序付き辞書の有用性はほぼ無くなった

しかし、以下のような点が通常の辞書よりも順序付き辞書の方が優れています。

順序付き辞書の有用性
  • 通常の辞書よりも並び替えが得意
  • 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

基本的には通常の辞書と使い方は変わりません。

【Python】辞書(マップ)の定義と使い方【dict】この記事では、Pythonの辞書の使い方を解説します。辞書はマップや連想配列と呼ばれ key と value の2つの値を用いて扱われます。名前(key) と 値(value) を 紐つけることで key から value を呼び出すことができます。...

順序付き辞書の等価判定

順序付き辞書同士を等価判定する際には順序が影響します。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以前では辞書は順序を保持しないことに注意しましょう。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ