美文网首页Python
Python OrderedDict

Python OrderedDict

作者: RoyTien | 来源:发表于2019-08-16 19:59 被阅读0次

OrderedDict

Python 的 collections.OrderedDictdict 的派生类,最大的特征是它是一个有顺序的 dict,(dict 是无序的),它维护了 key-value 的添加顺序。即先添加的 key-value 对排在前面,后添加的 key-value 对排在后面。

因此,即使两个 OrderedDict 中的 key-value 对完全相同,但只要它们的顺序不同,它们也不会相等。

次序问题

但是,这样生成的 OrderedDict 并没有预想中的顺序:

>>> OrderedDict({'a':1, 'b':2, 'c':3, 'd':4})
OrderedDict([('a', 1), ('c', 3), ('b', 2), ('d', 4)])

原因

为什么?因为这是因为上面的代码等价于下面的代码:

result = OrderedDict()
for key, value in {'a':1, 'b':2, 'c':3, 'd':4}.items():
    result[key] = value

OrderedDict 的关键在于维护 item 添加的顺序,而不是 item 本身的顺序。

{'a':1, 'b':2, 'c':3, 'd':4}items() 是不能保证次序的,因此最后得到的 OrderedDict 的次序和输入的次序不同。

解决方法

不用 dict 而使用 list 来生成 OrderedDict。因为 list 是有顺序的,这样就可以保证 OrderedDict 的次序和输入次序相同。

>>> OrderedDict([('a', 1), ('c', 3), ('b', 2), ('d', 4)])  # 能保证次序
OrderedDict([('a', 1), ('c', 3), ('b', 2), ('d', 4)])

>>> OrderedDict([('a', 1), ('b', 3), ('c', 2), ('d', 4)])  # 注意b, c的位置换了
OrderedDict([('a', 1), ('b', 3), ('c', 2), ('d', 4)])

>>> OrderedDict({'a':1, 'b':3, 'c':3, 'd':4})  # 对比:{}则不能保持b,c的次序
OrderedDict([('a', 1), ('c', 3), ('b', 3), ('d', 4)])

分析

OrderedDict 继承 dict,而 dict__init__() 规则如下。

def __init__(self):
    """
    dict(iterable) -> new dictionary initialized as if via:
        d = {}
        for k, v in iterable:
            d[k] = v
    """

相关文章

网友评论

    本文标题:Python OrderedDict

    本文链接:https://www.haomeiwen.com/subject/acmtsctx.html