如何嵌套OrderedDict?
我试过了:
table=collections.OrderedDict()
table['E']['a']='abc'
但这显示错误。
我也试过了:
table=collections.OrderedDict(OrderedDict())
table['E']['a']='abc'
这也显示错误。
我试过了:
table=collections.OrderedDict()
table['E']=collections.OrderedDict()
table['E']['a']='abc'
这很好。
在我的编码中,我不得不这样使用:
table=collections.OrderedDict()
for lhs in left:
table[lhs]=collections.OrderedDict()
for val in terminal:
table[lhs][val]=0
工作正常。但有没有其他方法。因为我读了python自动管理它的数据结构。
无论如何都要声明一个字典以及它将会有多少嵌套以及它的嵌套数据结构在一行中。
使用额外的循环来声明字典感觉就像我在python中遗漏了一些东西。
答案 0 :(得分:8)
您可以定义自己的OrderedDict
自定义子类,处理__missing__
方法以支持无限嵌套。
from collections import OrderedDict
class MyDict(OrderedDict):
def __missing__(self, key):
val = self[key] = MyDict()
return val
演示:
>>> d = MyDict()
>>> d['b']['c']['e'] = 100
>>> d['a']['c']['e'] = 100
>>> d.keys()
['b', 'a']
>>> d['a']['d']['e'] = 100
>>> d['a'].keys()
['c', 'd']
答案 1 :(得分:2)
如果你真的想在一行中完成,那么这将有效
table = collections.OrderedDict([(lhs, collections.OrderedDict(zip(terminal, [0] * len(terminal)))) for lhs in left])
你最好(特别是如果终端有很多成员)做
zipped = zip(terminal, [0] * len(terminal))
table = collections.OrderedDict([(lhs, collections.OrderedDict(zipped)) for lhs in left])
答案 2 :(得分:2)
class OrderedDefaultDict(OrderedDict):
def __init__(self, default_factory=None, *args, **kwargs):
super(OrderedDefaultDict, self).__init__(*args, **kwargs)
self.default_factory = default_factory
def __missing__(self, key):
if self.default_factory is None:
raise KeyError(key)
val = self[key] = self.default_factory()
return val
使用OrderedDict
类似行为将defaultdict
子类化为足够简单。然后,您可以使用OrderedDefaultDict
,如下所示:
table = OrderedDefaultDict(OrderedDict)
table['a']['b'] = 3