Подтвердить что ты не робот

Python: расширение класса 'dict'

Мне нужно решить это упражнение:

Словари Python не сохраняют порядок вставленных данных или сохраняют данные, отсортированные по ключу. Напишите расширение для класса dict, экземпляры которого будут хранить данные, отсортированные по их значению ключа. Обратите внимание, что порядок должен сохраняться также при добавлении новых элементов.

Как продлить dict? Должен ли я иметь доступ к исходному коду для типа dict?

4b9b3361

Ответ 1

Вы можете либо подклассом 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]

Ответ 3

Если вы используете python 2.7+, см. collections.OrderedDict.
В противном случае, backport (скопируйте источник) или посмотрите Рецепт 576693: Упорядоченный словарь для Py2.4 (Python).

Но если вам действительно нужно расширить dict, начните с UserDict, источник которого вы можете найти в /lib/UserDict.py вашего дистрибутива python.

Ответ 4

Хорошие новости: проблема не сложная.

Чтобы сориентироваться и увидеть внутренности 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.

Если вы застряли посетите этот сайт, чтобы получить некоторые идеи, но don 't copy/paste, ваш учитель не увидит это любезно.