Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのOrderedDictとは?通常のdictとの違いと使い方を徹底解説

OrderedDictとは

OrderedDictは、Pythonの標準ライブラリcollectionsモジュールに用意されている、dict(辞書)オブジェクトのサブクラスです。通常のdictとの最大の違いは、キーを挿入した順序を常に保持するという点にあります。従来のdictでは、要素の並び順が挿入順になるとは限りませんでした。

なお、Python 3.7以降では、通常のdictも挿入順序を保持することが言語仕様として保証されるようになりました。ただし、OrderedDictにはmove_to_end()など順序を操作するための専用メソッドが用意されており、順序を明示的に制御したい場面では今なお有用です。

OrderedDictを使用するには、まずcollectionsモジュールをインポートします。

import collections

通常のdictとOrderedDictの違い

ここでは、通常のdictとOrderedDictに同じキーと値を登録し、その挙動を比較してみましょう。次の例のように、dictの要素の並び順は挿入順と異なる場合がありますが、OrderedDictでは必ず挿入した順序どおりに出力されます。

サンプルコード

import collections

# 通常のdictを作成
my_dict = {}
my_dict['AA'] = 11
my_dict['BB'] = 22
my_dict['CC'] = 33
my_dict['DD'] = 44
for item in my_dict.items():
    print(item)
print()

# OrderedDictを作成
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
    print(item)

実行結果

('AA', 11)
('CC', 33)
('BB', 22)
('DD', 44)

('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)

特定のキーの値を変更した場合の挙動

既存のキーに対して新しい値を代入しても、OrderedDictではキーの順序は変わりません。一方、通常のdictの場合、この挙動は環境やバージョンによって異なることがあります。

サンプルコード

import collections

# 通常のdictを作成
my_dict = {}
my_dict['AA'] = 11
my_dict['BB'] = 22
my_dict['CC'] = 33
my_dict['DD'] = 44
for item in my_dict.items():
    print(item)

# キーBBの値を変更
my_dict['BB'] = 100
print('Dictの値変更後:')
for item in my_dict.items():
    print(item)
print()

# OrderedDictを作成
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
    print(item)

# キーBBの値を変更
my_ord_dict['BB'] = 100
print('OrderedDictの値変更後:')
for item in my_ord_dict.items():
    print(item)

実行結果

('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
Dictの値変更後:
('AA', 11)
('CC', 33)
('DD', 44)
('BB', 100)

('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
OrderedDictの値変更後:
('AA', 11)
('BB', 100)
('CC', 33)
('DD', 44)

要素の削除と再挿入

OrderedDictから要素を削除した後に、同じキーと値を再度挿入すると、その要素は末尾(最後)に移動します。これは、削除の時点でそのキーの順序情報が失われ、再挿入時に新規エントリとして扱われるためです。

サンプルコード

import collections

# OrderedDictを作成
my_ord_dict = collections.OrderedDict()
my_ord_dict['AA'] = 11
my_ord_dict['BB'] = 22
my_ord_dict['CC'] = 33
my_ord_dict['DD'] = 44
for item in my_ord_dict.items():
    print(item)

# キーBBの要素を削除
my_ord_dict.pop('BB')
print('削除後:')
for item in my_ord_dict.items():
    print(item)

# 要素を再挿入
my_ord_dict['BB'] = 22
print('再挿入後:')
for item in my_ord_dict.items():
    print(item)

実行結果

('AA', 11)
('BB', 22)
('CC', 33)
('DD', 44)
削除後:
('AA', 11)
('CC', 33)
('DD', 44)
再挿入後:
('AA', 11)
('CC', 33)
('DD', 44)
('BB', 22)

まとめ

OrderedDictは、キーの挿入順序を確実に保持したい場合に便利なクラスです。値の変更だけでは順序は変わりませんが、一度削除して再挿入すると要素が末尾へ移動する点には注意が必要です。Python 3.7以降の通常のdictも挿入順を保持しますが、順序を明示的に操作したい場面ではOrderedDictが依然として有効な選択肢となります。

  1. Pythonでサイクルソートを実装する方法

    この記事では、次の問題に対する解決策をわかりやすく解説していきます。問題文配列が与えられたとき、サイクルソート(Cycle Sort)の考え方を用いてその配列をソートします。サイクルソートはインプレース(in-place)アルゴリズムの一種で、要素の入れ替え(スワップ)を「サイクル(循環)」を形成する形で行うのが大きな特徴です。理論上の書き込み回数が最小となるよう設計されているため、メモリへの書き込みコストが高い環境で特に有用とされるアルゴリズムです。それでは、以下の実装例で具体的な解決策を見ていきましょう。実装例def cycleSort(array): writes = 0

  2. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが