我必须解决这个练习:
Python 的字典不保留插入数据的顺序,也不存储按键排序的数据。为 dict 类编写一个扩展,其实例将保持数据按其键值排序。请注意,添加新元素时也必须保留顺序。
我该如何延长dict
?我需要访问该dict
类型的源代码吗?
我必须解决这个练习:
Python 的字典不保留插入数据的顺序,也不存储按键排序的数据。为 dict 类编写一个扩展,其实例将保持数据按其键值排序。请注意,添加新元素时也必须保留顺序。
我该如何延长dict
?我需要访问该dict
类型的源代码吗?
您可以子类化dict
或UserDict
,因为范已经谈到了 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]
dict 的实施不会帮助您完成任务。您想要的是一个与 具有相同接口dict
但实现不同的类。这将需要实现 , 等方法__getitem__
。__setitem__
如果您在 Google 上搜索“ordereddict”,您会发现很多示例。
如果您使用 python 2.7+,请参阅collections.OrderedDict。
否则,向后移植(复制源代码)或参见配方 576693:Py2.4 (Python) 的有序字典。
但是如果你真的需要扩展dict
,那么从UserDict开始,你可以在/lib/UserDict.py
你的 python 发行版中找到它的源代码(Lib/collections/__init__.py
使用 Python 3)。
好消息:这个问题一点也不难。
为了四处逛逛,看看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 中的继承。
如果您遇到困难, 请访问此站点以获取一些想法,但不要复制/粘贴,您的老师不会友好地看到它。