正如文档所说:
键和值以非随机的任意顺序迭代,随 Python 实现而变化,并取决于字典的插入和删除历史。
换句话说,字典没有内在的顺序。你可以看到,没有所有复杂的附加功能:
>>> print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
如果您想要一个按插入顺序维护其键的字典,您可以使用OrderedDict
.
但是,在这种情况下,这还不足以帮助您。如果您构造 a dict
(具有任意顺序),然后将其传递给 a OrderedDict
,您所做的就是冻结该初始任意顺序:
>>> from collections import OrderedDict
>>> print OrderedDict({'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1})
OrderedDict([('A', 1), ('c1', 0.5), ('gamma', 1), ('lambda', 1)])
其中repr
应该OrderedDict
给你一个线索,告诉你如何创建一个OrderedDict
带有初始值的顺序:从一个序列创建它,其中每个元素都是一个键值对:
>>> print OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
如果您想自动激活OrderedDict
,您可以通过在现有课程中使用OrderedDict
而不是来做到这一点。dict
但是,您可能需要考虑您正在使用的类的一些问题。特别是,您确实希望super
对父类方法使用而不是经典风格的调用;如果你这样做了,你可以定义class AutoVivifiedOrderedDict(OrderedDict, AutoVivification): pass
并完成它!另外,我认为您的班级不会按原样正确腌制。
如果您使用 adefaultdict
进行自动生存,它已经处理了所有棘手的问题:
def AutoVivification():
return defaultdict(AutoVivification)
如果你想添加排序,你需要一个OrderedDefaultDict
,所以你可以这样做:
def OrderedAutoVivification():
return OrderedDefaultDict(AutoVivification)
如果您不知道如何创建OrderedDefaultDict
自己,请搜索食谱。(您几乎可以从两个类继承......除了它们具有不同的签名这一事实,因此您需要考虑您__init__
应该是什么样子并使用正确的参数显式调用正确的基本初始化程序。有关一些讨论,请参阅此问题。 )