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不是最佳选择,因为公认的答案使用了djangosortedct
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)