python嵌套字典:来自集合的OrderedDict

时间:2013-09-15 06:18:45

标签: python dictionary nested

如何嵌套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中遗漏了一些东西。

3 个答案:

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