めざせ趣味グラマー!!

SEやPGになるのをあきらめ趣味グラマーになるため日々修行する日記

pythonの辞書で要素の追加順を保存する

pythonの辞書型は要素の順番が入れ替わってしまう可能性があります。

それは要素の追加順を保存しておく機能がないためです。

例えば

>>> user={}
>>> user['id']=1
>>> user['age']=22
>>> user['name']="test"
>>> user
{'age': 22, 'id': 1, 'name': 'test'}

となり追加した順番が異なっていることが分かります。

 

その際に一から作り直すのは面倒くさいので  辞書型→配列へとデータ構成を変更するのが面倒くさいので、そういうときはOrderedDictを使いましょう。

これはpython2.7とpython3.1で追加された機能で、辞書型に追加された順番も保存しておく事ができる機能です。

 

この機能を使うには

>>> import collections

のようにまずcollectionモジュールをインポートします。

>>> user=collections.OrderedDict()
>>> user
OrderedDict()
とするとOrderedDictオブジェクトが生成されます。

 

では先ほどと同様にして要素の追加をしてみましょう。
>>> user['id']=1
>>> user['age']=22
>>> user['name']="test"
>>> user
OrderedDict([('id', 1), ('age', 22), ('name', 'test')])

となり追加された順番が保存されていることが分かります。

この機能は特にfor文の中でin演算子を使って取り出す際に、順番に取り出せるようになります。

リストを使えば追加順を自由に設定できますが、簡単に実装したい時に使えるかと思います。

(僕の場合は辞書が追加順になっていると勘違いをして実装したので応急処置として使いましたw)

 

もしpython2.7、3.0以下のバージョンで使いたい場合はordereddictモジュールを用いる事で可能な様です。

150720追記 コードに誤りがあったため修正しました。

OrderedDictは「追加する」順番を保存する機能はあるが、書き込んだ順番の値は保存してくれません。

>>> from collections import OrderedDict
>>> test_ordereddict = OrderedDict(one = 1, two = 2, three = 3) >>> print test_ordereddict OrderedDict([('one', 1), ('three', 3), ('two', 2)])

値を追加しているようにコードを書けば、思っている実行結果になります。

>>> d1 = OrderedDict(one = 1)
>>> d1['two'] = 2
>>> d1['three'] = 3
>>> d1
OrderedDict([('one', 1), ('two', 2)], ('three', 3))


参考にしたページ
http://shannon-lab.org/?p=1743