Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:扩展';dict';班_Python_Extend_Dictionary - Fatal编程技术网

Python:扩展';dict';班

Python:扩展';dict';班,python,extend,dictionary,Python,Extend,Dictionary,我必须解决这个问题: Python的字典既不保留插入数据的顺序,也不存储按键排序的数据。为dict类编写扩展,其实例将按键值对数据进行排序。请注意,添加新元素时也必须保留顺序 如何扩展dict?我是否需要访问dict类型的源代码?dict的实现不会帮助您完成任务。您需要的是一个类,该类具有与dict相同的接口,但具有不同的实现。如果你搜索“ordereddict”,你会发现很多例子。如果你使用python 2.7+,请参见。 否则,请返回端口(复制源)或参阅 但是如果您真的需要扩展dict,那么

我必须解决这个问题:

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


如何扩展dict?我是否需要访问dict类型的源代码?

dict的实现不会帮助您完成任务。您需要的是一个类,该类具有与
dict
相同的接口,但具有不同的实现。如果你搜索“ordereddict”,你会发现很多例子。

如果你使用python 2.7+,请参见。
否则,请返回端口(复制源)或参阅


但是如果您真的需要扩展
dict
,那么从python发行版的
/lib/UserDict.py
中可以找到的源代码开始(
lib/collections/\uu init\uuuuuuuuuuuuuupy
,使用python 3)。

好消息:问题一点也不难

要想查看
类的内脏,您可以使用

>>> 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']
还有
帮助(dict)
,它有一个非常完整的交互式文档,当然您还可以访问更完整的

一旦你掌握了
dict
在幕后所做的事情,你就应该了解


如果你陷入困境访问以获取一些想法,但不要复制/粘贴,你的老师将不会友好地看到它。

你可以将
dict
UserDict
子类化,因为van已经谈到了UserDict,让我们看看
dict

在解释器中键入
help(dict)
,您将看到一个大的方法列表。您需要覆盖所有修改dict的方法以及在dict上迭代的方法

修改dict的方法包括
\uuuu delitem\uuuuu
\uuuu setitem\uuuuu
清除

迭代dict的方法包括
\uu iter\uu

这应该让你开始

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

阅读collections.ABC中有关扩展
映射以实现有序字典的信息@user280560:如果你这样做,确保你告诉你的讲师你从哪里得到代码,因为你没有写代码,而是下载了代码。@S.Lott:我想他是不允许复制粘贴的,他们使用的是2.5/2.6。我也不认为任务是实现
OrderedDict
,因为这保留了插入顺序,而不是保持排序键顺序。有没有可能用Python3做一个工作示例?我开始更改
self.itemlist.append(key)
set(self.itemlist).add(key)
以使其正常工作,但顺序没有保留anymore@z3d0r,在Python3中,
.keys()
不再返回列表,因此您需要在
\uuu init\uu
方法中使用
self.itemlist=list(super(odict,self).keys())
。谢谢,我还注意到
values()
itervalues()
方法不再存在,而且
keys()
是一个集合而不是一个列表,那么
def keys(self):return set(self.itemlist)
是否正确?因为订单没有保留,所以仍在处理yet@z3d0,则必须返回列表或生成器。如果您退回一套,订单将丢失。如果你不只是做练习,你可以使用
collections.OrderedDict