web-dev-qa-db-ja.com

Python: 'dict'クラスを拡張する

私はこの演習を解決する必要があります:

Pythonの辞書は、挿入されたデータの順序を保持したり、キーで並べ替えられたデータを保存したりしません。インスタンスがキー値でソートされたデータを保持するdictクラスの拡張機能を記述します。新しい要素が追加された場合も、順序を保持する必要があることに注意してください。

dictを拡張するにはどうすればよいですか? dictタイプのソースコードにアクセスする必要がありますか?

22
Sgotenks

VanはすでにUserDictについて話しているので、dictまたはUserDictのいずれかをサブクラス化できます。dictを見てみましょう。

インタプリタにhelp(dict)と入力すると、メソッドの大きなリストが表示されます。 dictを変更するすべてのメソッドと、dictを反復処理するメソッドをオーバーライドする必要があります。

Dictを変更するメソッドには、__delitem____setitem__clearなどがあります。

Dictを反復するメソッドには、__iter__keysvaluesitemsなどがあります。

これで始められるはずです

>>> class odict(dict):
...     def __init__(self, *args, **kw):
...         super(odict,self).__init__(*args, **kw)
...         self.itemlist = super(odict,self).keys()
...     def __setitem__(self, key, value):
...          # TODO: what should happen to the order if
...          #       the key is already in the dict       
...         self.itemlist.append(key)
...         super(odict,self).__setitem__(key, value)
...     def __iter__(self):
...         return iter(self.itemlist)
...     def keys(self):
...         return self.itemlist
...     def values(self):
...         return [self[key] for key in self]  
...     def itervalues(self):
...         return (self[key] for key in self)
... 
>>> od = odict(a=1,b=2)
>>> print od
{'a': 1, 'b': 2}
>>> od['d']=4
>>> od['c']=3
>>> print od   # look at the `__str__` and `__repr__` methods 
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>> print od.keys()
['a', 'b', 'd', 'c']
>>> print od.values()
[1, 2, 4, 3]
31
John La Rooy

Dictの実装は、タスクを支援しません。必要なのは、dictと同じインターフェースを持つが、実装が異なるクラスです。 __getitem____setitem__などのメソッドを実装する必要があります 「ordereddict」をグーグルで検索すると、多くの例が見つかります。

9

python 2.7+を使用する場合は、 collections.OrderedDict を参照してください。
それ以外の場合は、バックポート(ソースをコピー)するか、 レシピ576693:Py2.4(Python)の順序付き辞書 を参照してください。

しかし、本当にdictを拡張する必要がある場合は、 serDict から始めてください。ソースは/lib/UserDict.pyあなたのpythonディストリビューション(Lib/collections/__init__.py with Python 3)。

6
van