【问题标题】:Using an OrderedDict within a dictionary declaration在字典声明中使用 OrderedDict
【发布时间】:2013-12-26 14:04:24
【问题描述】:

我有以下相当复杂的数据结构:

temp_dict = {
    'a': {
        'aardvark': (6,True),
        'apple': (3,True)
    },
    'b':{
        'banana': (2,False),
        'bobble': (8,True)
    }
}
print(temp_dict['a'])

它是一个包含另一个字典层 (a,b) 的字典 (temp_dict),它包含另一个包含元组的字典 (aardvark, apple)。

但这会输出: {'apple': (3, True), 'aardvark': (6, True)}

不介意a,b的顺序;但我需要aardvark, apple 层是orderedDict - 他们必须记住他们插入的顺序(永远不会排序)。所以我试过了:

temp_dict = {
    'a': OrderedDict{
        'aardvark': (6,True),
        'apple': (3,True)
    },
    'b':OrderedDict{
        'banana': (2,False),
        'bobble': (8,True)
    }
}

但这只是给了我无效的语法。 我该怎么做呢?我发现的所有示例都没有显示在另一个数据结构中声明 OrderedDict。

谢谢

【问题讨论】:

    标签: python python-3.x dictionary ordereddictionary


    【解决方案1】:

    试试:

    temp_dict = {
        'a': OrderedDict([
            ('aardvark', (6,True)),
            ('apple', (3,True)),
        ]),
        'b':OrderedDict([
            ('banana', (2,False)),
            ('bobble', (8,True)),
        ]),
    }
    

    【讨论】:

    • 我不会假装理解这两个答案之间的区别(尽管@sweeneyrod 已经更新了他的答案)——但我有什么资格质疑专家呢? :-) 谢谢!
    • @GIS-Jonathan,唯一的区别是我使用的是列表,而 sweeneyrod 使用的是元组(元组是不可变的,因此在这种情况下更有效),并且我将逗号附加到如果您要更改列表中的顺序,或者通过复制现有元素和更改值来添加新元素,则列表中的每一项(包括最后一项)都非常有用。
    【解决方案2】:

    这样做:

    temp_dict = {
        'a': OrderedDict((
            ('aardvark', (6,True)),
            ('apple', (3,True))
        )),
        'b':OrderedDict((
            ('banana', (2,False)),
            ('bobble', (8,True))
        ))
    }
    

    (但也要考虑改用类。我发现嵌套超过 1 层的字典通常是解决问题的错误方法。)

    使用字典初始化OrderedDict 保证插入顺序在初始化之后保持。

    >>> d = OrderedDict({1: 2, 3: 4})
    >>> d[5] = 6
    

    d 现在必须是 OrderedDict([(1, 2), (3, 4), (5, 6)])OrderedDict([(3, 4), (1, 2), (5, 6)])

    另一方面:

    >>> d = OrderedDict([(1, 2), (3, 4)])
    >>> d[5] = 6
    

    d 现在只能是OrderedDict([(1, 2), (3, 4), (5, 6)])

    【讨论】:

    • 啊,我错过了一些不明显的常规括号。是的,这很好用。谢谢! (而且速度也快得离谱!;-))
    • @GIS-Jonathan 没问题
    • 当条目 aardvarkapple 更改顺序时(类似 bananabobble),此示例给出错误的结果,因为您使用无序的 dict 来填充有序的当然会失去它的秩序。
    • @kroolik 哦,是的,我忘记了有序字典是如何工作的。你的答案是正确的。
    • @GIS-Jonathan 我可能回答得很快,但实际上是错误的。字典不一定是有序的,所以用一个初始化的 OrderedDict 也不会是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2023-01-17
    • 2021-09-27
    • 2016-03-22
    • 2019-08-01
    • 2013-03-30
    相关资源
    最近更新 更多