Python:Extend 'dict' класс

Я должен решить это осуществление:

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

Как я расширяюсь dict? Сделайте у меня должен быть доступ к исходному коду для dict ввести?

21
задан Mu Mind 4 October 2012 в 07:40
поделиться

4 ответа

Вы можете подклассифицировать dict или UserDict, поскольку Ван уже говорил о UserDict, давайте рассмотрим dict.

Введите help(dict) в интерпретатор, и вы увидите большой список методов. Вам нужно будет переопределить все методы, которые изменяют dict, а также методы, которые выполняют итерации над dict.

Методы, изменяющие dict, включают __delitem__, __setitem__, clear и т.д.

Методы, которые выполняют итерацию диктанта, включают __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]
30
ответ дан 29 November 2019 в 20:06
поделиться

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

Для того, чтобы порыться и посмотреть внутренности класса, вы можете использовать

>>> 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.

Если вы застряли , посетите этот сайт, чтобы получить некоторые идеи, но не копируйте/вставляйте, ваш учитель не будет смотреть на это доброжелательно.

5
ответ дан 29 November 2019 в 20:06
поделиться

Реализация dict не поможет вам с этой задачей. Вам нужен класс с тем же интерфейсом, что и dict , но с другой реализацией. Для этого потребуется реализовать такие методы, как __ getitem __ , __ setitem __ и т. Д. Если вы введете в Google запрос «orders», вы найдете множество примеров.

9
ответ дан 29 November 2019 в 20:06
поделиться

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

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

5
ответ дан 29 November 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: