Python 如何按定义打印词典

Python 如何按定义打印词典,python,dictionary,autovivification,Python,Dictionary,Autovivification,我有以下代码: from functions import * powers = AutoVivification() powers[1] = {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1} print powers[1] 我的自生照片如下(摘自:): 它打印以下内容: {'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1} 请注意,订单已更改。现在是按字母顺序排列的。有没有办法防止这种情况发生?抱歉,还不够清楚

我有以下代码:

from functions import *

powers = AutoVivification()
powers[1] = {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}

print powers[1]
我的自生照片如下(摘自:):

它打印以下内容:

{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}

请注意,订单已更改。现在是按字母顺序排列的。有没有办法防止这种情况发生?抱歉,还不够清楚:(在不更改键的情况下,并使用Autovification的属性“使任意扩展字典变得超级容易”)

字典在Python中没有排序。一旦排序,它将不会保留其顺序。相反,使用

from collections import OrderedDict

powers = OrderedDict()
powers[1] = {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}

print powers[1]

您可以添加另一个键来指定顺序

import operator

powers = {0: ['c1', 0.5], 1: ['gamma', 1], 2: ['lambda', 1], 3: ['A', 1]}
print sorted(powers.items(), key=operator.itemgetter(0))
希望这有帮助

如前所述:

键和值以非随机的任意顺序迭代,在Python实现中有所不同,并且取决于字典的插入和删除历史

换句话说,字典没有固有的顺序。你可以看到,没有你那些复杂的额外工作:

>>> print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1}
{'A': 1, 'c1': 0.5, 'gamma': 1, 'lambda': 1}
如果您想要一个按插入顺序维护其键的dict,可以使用


但是,在这种情况下,这还不足以帮助您。如果构造一个
dict
(具有任意顺序),然后将其传递给
orderedict
,您所做的只是冻结初始的任意顺序:

>>> 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)])
orderedict
repr
应为您提供如何创建具有初始值顺序的
orderedict
的线索:从序列创建,其中每个元素都是键值对:

>>> print OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])
OrderedDict([('c1', 0.5), ('gamma', 1), ('lambda', 1), ('A', 1)])

如果要自动激活
orderedict
,可以在现有类中使用
orderedict
而不是
dict
。但是,您使用的类可能有一些问题,您可能需要考虑。特别是,您确实希望对父类方法使用
super
而不是经典样式的调用;如果您已经这样做了,您可以定义
类autovividedordereddict(OrderedDict,autovividation):通过
并完成它!而且,我认为你们的课不会像现在这样泡菜


如果您使用
defaultdict
进行自动激活,它已经解决了所有棘手的问题:

def AutoVivification():
    return defaultdict(AutoVivification)
然后,如果您想向其添加排序,则需要一个
OrderedDefaultDict
,因此您可以执行以下操作:

def OrderedAutoVivification():
    return OrderedDefaultDict(AutoVivification)


如果您不知道如何自己创建
OrderedDefaultDict
,请搜索食谱。(您几乎可以从这两个类继承…除了它们具有不同的签名这一事实,因此您需要仔细考虑
\uuu init\uuuu
应该是什么样子,并使用正确的参数显式调用正确的基初始值设定项。有关一些讨论,请参阅。)

字典是哈希映射,没有顺序。如果您需要对其进行排序,您可以使用集合中的
OrderedDict
。此外,您当前的
autovification
类本质上是一个嵌套的
defaultdict
,如
dd=lambda:defaultdict(dd)
…所有关于自动vification的内容都与问题无关。只要做
打印{'c1':0.5,'gamma':1,'lambda':1,'A':1}
,您就会看到值以完全相同的方式重新排序。这意味着这是一个由大约300个其他问题组成的dup,所以…我将随机选择其中一个。@abarner不是最佳选择,因为公认的答案使用了django
sortedct
s(第二个答案使用了
OrderedDict
)…但不管怎样,这个问题已经得到了详尽的回答。回答错误的问题?这是怎么回事?DropDownListValues是一个Dict。1.这大概是订购Dict的最糟糕方式。2.这个问题与jinja或html无关。3.安装jinja2来订购字典有点毫无意义。@hyperforeus我相信这是just的意思是作为一个例子(或快速复制粘贴的现有代码)-实际的订购过程与jinja没有任何关系。但在我看来,这是一个糟糕的例子,因为它太冗长,格式不好,并且包含大部分不相关的代码。这里对“sortable”的引用令人困惑;我不确定您的意思是什么。将使用OrderedDict()与AutoVivification()具有相同的效果,并对其进行排序?(我对Autovification仍不清楚。我真正知道的是,它使任意扩展字典变得非常容易,这非常好)@MichaelJensen:正如l4mpi的评论所解释的那样,使用
defaultdict
进行自动活体化是一种简单的方法。如果您希望对其进行排序和自动活体化,可以使用
OrderedDefaultDict
(如果您不知道如何自己构建,请搜索配方)同样的方法。@abarnert我澄清了我的答案,谢谢。我也不知道什么是自生():)好了,现在我知道你所说的“排序”是什么意思了,我不明白它有什么关系。他从不整理口述,你也一样。重要的是,即使你什么也不做,它也不会保持它的顺序。试过这个,仍然得到同样的结果。将我的代码更改为:
powers=orderedAutovification()
,使用您的代码:
def orderedAutovification():return OrderedDefaultDict(Autovification)
,并使用来自的
OrderedDefaultDict
。我会继续找的..我应该用新代码提交另一个问题。嗯,我的结论是这并不简单。。(显然?)@juggler:你读了我的全部答案了吗?我解释了为什么会得到完全相同的结果:
{'c1':0.5,'gamma':1,'lambda':1,'A':1}
是一个
dict
,这意味着它具有任意顺序。将任意顺序的
dict
分配给
powers[1]
只会将原始任意顺序锁定为永久顺序。首先,您需要避免通过使用一系列对(或通过逐个添加值,或以其他方式)来构造一个
dict
。我并不完全理解:-)我确实逐渐明白了(尝试了许多
def OrderedAutoVivification():
    return OrderedDefaultDict(AutoVivification)