私はこの演習を解決する必要があります:
Pythonの辞書は、挿入されたデータの順序を保持したり、キーで並べ替えられたデータを保存したりしません。インスタンスがキー値でソートされたデータを保持するdictクラスの拡張機能を記述します。新しい要素が追加された場合も、順序を保持する必要があることに注意してください。
どうすれば拡張できdict
ますか?dict
タイプのソースコードにアクセスする必要がありますか?
私はこの演習を解決する必要があります:
Pythonの辞書は、挿入されたデータの順序を保持したり、キーで並べ替えられたデータを保存したりしません。インスタンスがキー値でソートされたデータを保持するdictクラスの拡張機能を記述します。新しい要素が追加された場合も、順序を保持する必要があることに注意してください。
どうすれば拡張できdict
ますか?dict
タイプのソースコードにアクセスする必要がありますか?
サブクラスにすることもdict
、UserDict
vanがすでに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)の順序付き辞書を参照してください。
ただし、本当にを拡張する必要がある場合は、Pythonディストリビューション(Python 3を使用)のソースであるUserDictdict
から始めてください。/lib/UserDict.py
Lib/collections/__init__.py
良いニュース:問題はまったく難しいことではありません。
の内臓を見回して見るためにclass
使用することができます
>>> dir(dict)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
および、これには非常に完全なインタラクティブドキュメントがありますが、もちろん、さらに完全なオンラインドキュメントhelp(dict)
にもアクセスできます。
dict
舞台裏で何が行われているのかを理解したら、Pythonでの継承について学ぶ必要があります。
行き詰まった場合は、 このサイトにアクセスしてアイデアを入手してください。ただし、コピー/貼り付けしないでください。先生はそれを親切に見ることができません。