python嵌套字典:集合中的OrderedDict

Posted

技术标签:

【中文标题】python嵌套字典:集合中的OrderedDict【英文标题】:python nesting dictionary: OrderedDict from collections 【发布时间】:2013-09-19 12:12:46 【问题描述】:

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

【问题讨论】:

如果任何管理员或此类用户阅读此内容,我想问一下upvote 和downvote 的概念。它是基于研究工作还是其他?有时感觉就像有人在报复,或者这个网站只针对某种语言的专业人士。这个问题没有显示什么类型的研究工作?如果它没有用,那么我不会问。如果我可以通过谷歌搜索找到它,我会在这里问机器人。 【参考方案1】:

如果你真的想在一行中完成,那么这会工作

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])

【讨论】:

0 初始化将成为我其余编码的一部分。我只需要嵌套部分。谢谢。我可以去掉拉链部分。 :D 这里的terminallhs 是什么?【参考方案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

用类似defaultdict 的行为对OrderedDict 进行子类化很简单。然后您可以使用OrderedDefaultDict,如下所示:

table = OrderedDefaultDict(OrderedDict)
table['a']['b'] = 3

【讨论】:

如果他想要无限嵌套,他必须定义类似def factory(): return OrderedDefaultDict(factory) 的东西并将其传递给根构造函数。 我用val = self[key] = self.__class__(self.default_factory) 更新了答案。它正在等待同行评审。我测试过,它对我有用。 @Rafe:编辑被拒绝,因为其目的是创建一个结合一般 OrderedDict 和 defaultdict 行为的类。您的编辑通过硬编码丢失键的特定行为来降低类的通用性;特别是,default_factory 实际上不再用于您编辑的任何内容。 @user2357112:我认为如果没有我的编辑,这个答案的模式应该被认为是错误的。它没有按要求嵌套自己。它是平的。只需尝试再深入一层,它就会失败。 default_factory 仍然通过 super() 传递给基类。 @Rafe:默认情况下,此答案不打算无限嵌套。它应该是 OrderedDict 和 defaultdict 的组合,应用用户提供的默认工厂。可以将其配置为使用适当的默认工厂 (def tree(): return OrderedDefaultDict(tree)) 无限嵌套,但也可以将其配置为嵌套到固定的有限级别,或执行其他操作。已经有另一个提供硬编码无限嵌套的答案。【参考方案3】:

您可以定义自己的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']

【讨论】:

在我问这个问题的时候,我对类的概念还不是很了解。现在,当我回顾它时,您的答案是一个更好、更复杂的答案。正如我所说,Pythonic 的方式来做到这一点。感谢您的回答。

以上是关于python嵌套字典:集合中的OrderedDict的主要内容,如果未能解决你的问题,请参考以下文章

python 列表元组字典集合的区别

python字典和列表区别都有哪些

Python学习:字典(dictionary)

python数据类型:列表元组字典集合

python 列表元组字典字典的区别

Python 中的字典操作