OrderedDict
Python 的 collections.OrderedDict
是 dict
的派生类,最大的特征是它是一个有顺序的 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
"""
网友评论