私はこの演習を解決する必要があります:
Pythonの辞書は、挿入されたデータの順序を保持したり、キーで並べ替えられたデータを保存したりしません。インスタンスがキー値でソートされたデータを保持するdictクラスの拡張機能を記述します。新しい要素が追加された場合も、順序を保持する必要があることに注意してください。
dict
を拡張するにはどうすればよいですか? dict
タイプのソースコードにアクセスする必要がありますか?
VanはすでにUserDictについて話しているので、dict
またはUserDict
のいずれかをサブクラス化できます。dict
を見てみましょう。
インタプリタにhelp(dict)
と入力すると、メソッドの大きなリストが表示されます。 dictを変更するすべてのメソッドと、dictを反復処理するメソッドをオーバーライドする必要があります。
Dictを変更するメソッドには、__delitem__
、__setitem__
、clear
などがあります。
Dictを反復するメソッドには、__iter__
、keys
、values
、items
などがあります。
これで始められるはずです
>>> 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]
Dictの実装は、タスクを支援しません。必要なのは、dict
と同じインターフェースを持つが、実装が異なるクラスです。 __getitem__
、__setitem__
などのメソッドを実装する必要があります 「ordereddict」をグーグルで検索すると、多くの例が見つかります。
python 2.7+を使用する場合は、 collections.OrderedDict を参照してください。
それ以外の場合は、バックポート(ソースをコピー)するか、 レシピ576693:Py2.4(Python)の順序付き辞書 を参照してください。
しかし、本当にdict
を拡張する必要がある場合は、 serDict から始めてください。ソースは/lib/UserDict.py
あなたのpythonディストリビューション(Lib/collections/__init__.py
with Python 3)。