我有以下代码:
from functions import *
powers = AutoVivification()
powers[1] = {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
print powers[1]
我的自动生成如下(取自:What is the best way to implement nested dictionaries?):
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
它打印以下内容:
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
注意订单已更改。它现在按字母顺序排列。有什么方法可以防止这种情况发生吗? sory,不够清楚:(没有更改密钥,并使用“使any arbitrar扩展字典超级容易”的自动生成属性)
答案 0 :(得分:3)
正如the documentation所说:
键和值以任意顺序迭代,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史。
换句话说,词典没有固有的顺序。你可以看到没有所有复杂的额外内容:
>>> print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
如果你想要一个按照插入顺序维护其键的字典,你可以使用OrderedDict
来完成。
但是,在这种情况下,这还不足以帮助你。如果你构造一个dict
(具有任意顺序),然后将其传递给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
的{{1}}应该为您提供如何创建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
进行自动更新,它已经处理了所有棘手的问题:
defaultdict
如果您想添加订单,则需要def AutoVivification():
return defaultdict(AutoVivification)
,因此您可以执行此操作:
OrderedDefaultDict
如果您不知道如何自己创建def OrderedAutoVivification():
return OrderedDefaultDict(AutoVivification)
,请搜索食谱。 (你几乎 只能继承这两个类......除了它们有不同的签名这一事实,所以你需要仔细思考你的OrderedDefaultDict
应该是什么样子并明确地调用正确的基本初始化器使用正确的参数。有关讨论,请参阅this question。)
答案 1 :(得分:-1)
字典不是用Python命令的。一旦排序,它将不会保留其订单。相反,使用
from collections import OrderedDict
powers = OrderedDict()
powers[1] = {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
print powers[1]
答案 2 :(得分:-4)
您可以添加另一个键来指定订单...
import operator
powers = {0: ['c1', 0.5], 1: ['gamma', 1], 2: ['lambda', 1], 3: ['A', 1]}
print sorted(powers.items(), key=operator.itemgetter(0))
希望这有帮助!