什么是正确的方法来初始化一个有序字典(OD) ,以便它保留初始数据的顺序?
from collections import OrderedDict
# Obviously wrong because regular dict loses order
d = OrderedDict({'b':2, 'a':1})
# An OD is represented by a list of tuples, so would this work?
d = OrderedDict([('b',2), ('a', 1)])
# What about using a list comprehension, will 'd' preserve the order of 'l'
l = ['b', 'a', 'c', 'aa']
d = OrderedDict([(i,i) for i in l])
问题:
OrderedDict
是否会保留初始化时传递的元组列表、元组列表、元组列表或列表列表等的顺序(上面第2和第3个例子) ?
如何去验证如果 OrderedDict
实际上维护一个订单?因为 dict
有一个不可预测的顺序,如果我的测试向量幸运地有一个与 dict 的不可预测顺序相同的初始顺序,该怎么办?例如,如果我写的是 d = OrderedDict({'a':1, 'b':2})
而不是 d = OrderedDict({'b':2, 'a':1})
,那么我可能会错误地得出顺序保持不变的结论。在这种情况下,我发现 dict
是按字母顺序排列的,但这可能并不总是正确的。使用反例验证数据结构是否保持顺序的可靠方法是什么,除非反复尝试测试向量,直到其中一个中断?
另外,我把这个留给 参考文献: “ OrderedDect 构造函数和 update ()方法都接受关键字参数,但是它们的顺序丢失了,因为 Python 的函数调用语义使用常规的无序字典传入关键字参数。”
P.P.S: 希望将来 OrderedDect 也能保留 kwargs 的顺序(示例1) : http://bugs.python.org/issue16991