Python:扩展'dict'类

27 投票
4 回答
46547 浏览
提问于 2025-04-15 19:41

我需要解决这个练习:

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__keysvaluesitems 等等。

这些内容应该能帮助你入门。

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

撰写回答