【发布时间】:2013-12-12 19:31:09
【问题描述】:
我有以下代码:
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}
请注意订单已更改。现在是按字母顺序排列的。有什么办法可以防止这种情况发生吗?抱歉,不够清楚:(不更改键,并使用“使任意扩展字典变得超级容易”的 autovivificaion 属性)
【问题讨论】:
-
字典是哈希图,没有排序。如果您需要订购,可以使用集合中的
OrderedDict。 -
另外,您当前的
AutoVivification类本质上是一个嵌套的defaultdict,如dd = lambda: defaultdict(dd)... -
所有关于自动复活的东西都与问题无关。只需执行
print {'c1': 0.5, 'gamma': 1, 'lambda': 1, 'A': 1},您就会看到以完全相同的方式重新排序的值。 -
这意味着这是关于 SO 的大约 300 个其他问题的重复……我将随机选择其中一个。
-
@abarnert 不是最佳选择,因为接受的答案使用 django
SortedDicts (虽然第二个答案使用OrderedDict)......但无论如何,这个问题已经得到了详尽的回答。跨度>
标签: python dictionary autovivification