home changes contents help options

118:ハッシュの要素を挿入した順に取り出す

Ruby のハッシュの役割をする Python の型は dict(辞書) です。

Python の辞書型には順序という概念はありません。そのため挿入した順に要素を取り出すことはできません。このため、標準の辞書型とは別の、順序を保持できる辞書型として、 collections.OrderedDict? が用意されています。

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3
>>> d
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>>
>>> for k in d:
...   print k,
...
a b c

OrderedDict? の popitem メソッドには last 引数が追加されており、末尾もしくは先頭からの値の取出しが可能となっています。

>>> d = OrderedDict.fromkeys([1,2,3,4], None)
>>> d
OrderedDict([(1, None), (2, None), (3, None), (4, None)])
>>>
>>> d.popitem(last=True)
(4, None)
>>> d.popitem(last=False)
(1, None)
>>> d.popitem() # 省略すると last=True と同じ動作
(3, None)

OrderedDict? は reversed 関数でキーの逆順アクセスが可能となっています。

>>> d = OrderedDict.fromkeys([1,2,3,4], None)
>>> d
OrderedDict([(1, None), (2, None), (3, None), (4, None)])
>>> reversed(d)
<generator object __reversed__ at 0x00BB2328>
>>> list(_)
[4, 3, 2, 1]

この OrderedDict? は Python 3.1 および 2.7 にて登場した新しいクラスです。 3.0, 2.6 以前で用いたい場合は、これと同機能である ordereddict モジュールで代用するとよいでしょう。 PyPI? からダウンロードできます。

また、 OrderedDict? の導入を提案していた PEP 372 でも同様の機能を持った他の実装が紹介されています。