如何按定义打印字典

时间:2013-12-12 19:31:10

标签: python dictionary autovivification

我有以下代码:

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扩展字典超级容易”的自动生成属性)

3 个答案:

答案 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))

希望这有帮助!