Python:扩展'dict'类
我需要解决这个练习:
Python 的字典(dictionaries)不会保持插入数据的顺序,也不会按键值(key)对数据进行排序。请为字典类写一个扩展,使得它的实例能够按键值排序数据。注意,当添加新元素时,顺序也必须保持。
我该如何扩展 dict
呢?我需要访问 dict
类型的源代码吗?
4 个回答
6
如果你使用的是 Python 2.7 及以上版本,可以看看 collections.OrderedDict。
如果不是这个版本,可以尝试把源代码复制过来,或者查看 Recipe 576693: Ordered Dictionary for Py2.4 (Python)。
不过,如果你真的需要扩展 dict
,那么可以从 UserDict 开始,相关的源代码可以在你的 Python 安装目录下的 /lib/UserDict.py
找到(在 Python 3 中是 Lib/collections/__init__.py
)。
11
使用字典(dict)的实现并不能解决你的问题。你需要的是一个类,它的使用方式和字典一样,但内部实现不同。这就需要你实现一些方法,比如 __getitem__
、__setitem__
等等。 如果你在网上搜索“ordereddict”,会找到很多相关的例子。
42
你可以选择继承 dict
或者 UserDict
。既然之前已经讲过 UserDict
,那我们就来看看 dict
。
在解释器里输入 help(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]