26

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

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

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

4

4 に答える 4

38

サブクラスにすることもdictUserDictvanがすでに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]
于 2010-02-24T21:34:46.013 に答える
11

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

于 2010-02-24T17:58:48.687 に答える
6

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

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

于 2010-02-24T17:59:19.803 に答える
5

良いニュース:問題はまったく難しいことではありません。

の内臓を見回して見るために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での継承について学ぶ必要があります。

行き詰まった場合は、 このサイトにアクセスしてアイデアを入手してください。ただし、コピー/貼り付けしないでください。先生はそれを親切に見ることができません。

于 2010-02-24T18:34:00.777 に答える