Python:扩展'dict'类

Sgo*_*nks 21 python dictionary extend

我必须解决这个问题:

Python的字典不保留插入数据的顺序,也不存储按键排序的数据.为dict类编写一个扩展,其实例将按照键值对数据进行排序.请注意,添加新元素时也必须保留顺序.

我该如何延伸dict?我是否需要访问该dict类型的源代码?

Joh*_*ooy 30

你可以子类化,dict或者UserDict,因为van已经谈过UserDict,让我们来看看dict.

输入help(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]
Run Code Online (Sandbox Code Playgroud)


Luk*_*ský 9

dict的实现不会帮助你完成任务.你想要的是一个具有相同接口dict但具有不同实现的类.这将需要实现像__getitem__,__setitem__等等的方法.如果你谷歌为"ordereddict",你会发现很多例子.

  • 阅读有关扩展`Mapping`以实现有序字典的collections.ABC信息.http://docs.python.org/library/collections.html#abcs-abstract-base-classes. (2认同)

van*_*van 5

如果你使用python 2.7+,那么请参阅collections.OrderedDict.
否则,反向移植(复制源)或参见食谱576693:Py2.4的有序字典(Python).

但是如果你真的需要扩展dict,那么从UserDict开始,你可以在/lib/UserDict.py你的python发行版中找到它.

  • 我不认为该任务是实现`OrderedDict`,因为它保留了_insertion_顺序而不是维护排序的键顺序. (2认同)

Est*_*ber 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']
Run Code Online (Sandbox Code Playgroud)

并且help(dict),它有一个非常完整的交互式文档,但当然您也可以访问更完整的在线文档.

一旦掌握dict了幕后的内容,就应该学习Python中的继承.

如果您遇到困难, 请访问此网站以获取一些想法,但不要复制/粘贴,您的老师不会看到它.