python OrderedDict便利だが注意が必要

社長のボヤキ編、

pytonのディクショナリは順番覚えてくれないから大変って方、OrderedDict使ってください!ただOrderedDictは便利だけど、使う場合は最初の書き込みには注意しないといけない。

#coding:utf-8
#!/usr/bin/env python
from collections import OrderedDict

d = OrderedDict(one=1, two=2, three=3)
print d

最初のdはえっっっ!と思うが、
OrderedDict([(‘one’, 1), (‘three’, 3), (‘two’, 2)])
のように表示されてしまう。
threeとtwo順番逆じゃね?順番記憶するんじゃなかったの?って思うかもしてませんが、

http://docs.python.jp/2/library/collections.html#collections.OrderedDict
にあるように追加 した順番を記憶するとあるだけです。書き込んだ順番は維持してくれない。。。

じっ、順番を維持するには???
追加しているように書く、

 

d1 = OrderedDict(one=1)
d1['two']=2
d1['three']=3
print d1['one']
d1['shannonlab'] = 'awesome'
print d1

for i in d1:
    print i, d1[i]

d1のように追加していくことにする。
すると、
下記プリントしたもの
one 1
two 2
three 3
shannonlab awesome

こんな感じでちゃんと順番が維持される。

もっと簡単に順番も維持されてもっと簡単に書き込む方法ないの?
下記DLようにタプルにしてやると、順番通り突っ込めます。
ちなみにdictで使うようにupdateも使えるので、
ついでにd2も作りupdateで追加してやると、

DL = (('four',4), ('five',5), ('six',6))
d2 = OrderedDict(DL)
d1.update(d2)

print d1

for i in d1:
    print i, d1[i]

こんな感じ!
one 1
two 2
three 3
shannonlab awesome
four 4
five 5
six 6

 

結構使えるよね!

 

参考サイト

http://d.hatena.ne.jp/artgear/20120126/1327569476
http://docs.python.jp/2/library/collections.html#collections.OrderedDict
http://stackoverflow.com/questions/9917178/last-element-in-ordereddict

Comments are closed.