Pythonの辞書で順番を保つにはOrderedDictを使う


このエントリーをはてなブックマークに追加

Pythonの辞書(dict)では、keyを登録した順番は記憶されません。

例えば以下のコードを実行すると、

# 普通のdictの場合
d = {}
d["zz"] = 0
d["cc"] = 30
d["aa"] = 10
d["bb"] = 20
d["aa"] = 40

for key, val in d.items():
    print(key, val)

以下の結果が得られます。登録した順番と異なる順番で要素が取り出されてしまいました。

cc 30
aa 40
bb 20
zz 0

辞書に登録したkeyの順番を保ちたい場合には、標準ライブラリのcollections.OrderedDictを使うのが良い方法です。 使い方はほとんどdictと同じです。

from collections import OrderedDict

od = OrderedDict()
od["zz"] = 0
od["cc"] = 30
od["aa"] = 10
od["bb"] = 20
od["aa"] = 40

for key, val in od.items():
    print(key, val)

実行結果は以下です。きちんと登録順にkeyが並んでいます。同じkeyに再代入した場合は後に登録した値が記録されています。

zz 0
cc 30
aa 40
bb 20

OrderedDictがあればOrderedSetがあってもよいような気がしますが、残念ながらないようです(Does Python have an ordered set? - Stack Overflow)。ただしレシピがOrderedSet « Python recipes « ActiveState Codeにあります。