Python

【Python】順序付き辞書【OrderedDict】

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

通常、Pythonの辞書は順序を保持しません。 Python3.7から辞書は、挿入順序を記憶するようになりました。Python3.8からは、 __reversed__メソッドも追加されたため、逆順にもできるようになり、順序付き辞書の有用性はほぼ無くなりました❗️

順序付き辞書の有用性
  • 通常の辞書よりも並び替えが得意
  • popitemメソッドでLIFOかFIFOかを指定できる
  • 要素を末尾に置き換えるmove_to_endメソッドが使える

collections.OrderedDict

順序付き辞書は、collectionsモジュールのOrderedDict()を使います。collectionsモジュールは、標準ライブラリなのでインポートするだけで使用可能です。

import collections

# 処理

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

特殊な性質として、等価判定に順序が影響します。

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

# 通常の辞書と比較する場合は、順序は影響しない
d = dict()
d['one'] = 1
d['three'] = 3
d['two'] = 2

print(od1 == d)
>> True

popitem(last=True)

通常の辞書のpopitemメソッドは、LIFO(後入れ先出し)の順序で要素を取得しますが、OrderedDictpopitemメソッドでは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(key, last=True)

key引数に指定された要素を末尾に移動します。last引数がFalseの場合は先頭に移動します。

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)])

od.move_to_end('three', False)
print(od.items())
>> odict_items([('three', 3), ('two', 2), ('one', 1)])
最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』