Categories: Python

【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以前では辞書は順序を保持しないことに注意しましょう。

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

7か月 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

7か月 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

7か月 ago

【Unity】割合から数値に数値から割合に変換する

この記事では、割合から数値に変換する関数…

7か月 ago

【Python】抽象クラスを定義する方法

この記事では、Pythonで抽象クラスを…

7か月 ago