Python: расширить класс 'dict' - PullRequest
       0

Python: расширить класс 'dict'

21 голосов
/ 24 февраля 2010

Я должен решить это упражнение:

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

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

Ответы [ 4 ]

30 голосов
/ 25 февраля 2010

Вы можете подкласс 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]
9 голосов
/ 24 февраля 2010

Реализация dict не поможет вам с заданием. Вам нужен класс с тем же интерфейсом, что и dict, но с другой реализацией. Это потребует реализации таких методов, как __getitem__, __setitem__ и т. Д. Если вы воспользуетесь Google для "ordersdict", вы найдете множество примеров.

5 голосов
/ 24 февраля 2010

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

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

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

5 голосов
/ 24 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...