正确的方式来初始化一个OrderedDict使用它的构造函数,以保持初始数据的顺序?

初始化有序字典(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保留初始化时(上面的第二和第三个例子)通过的元组列表的元组列表或列表的元组或列表的元组的顺序?

  • 如何validationOrderedDict实际维护订单? 由于dict具有不可预知的顺序,如果我的testing向量幸运地具有与字典的不可预知顺序相同的初始顺序呢? 例如,如果我写d = OrderedDict({'a':1, 'b':2}) ,而不是d = OrderedDict({'b':2, 'a':1}) d = OrderedDict({'a':1, 'b':2}) ,我可以错误地得出结论订单被保留。 在这种情况下,我发现dict是按字母顺序排列的,但这可能不总是正确的。 使用反例来validation数据结构是否保留顺序的可靠方法是什么?

PS我会留在这里作为参考 :“OrderedDict的构造函数和update()方法都接受关键字参数,但他们的顺序丢失,因为Python的函数调用语义传递关键字参数使用常规的无序字典”

PPS:希望将来,OrderedDict也会保留kwargs的顺序(例子1): http : //bugs.python.org/issue16991

OrderedDict将保留它有权访问的任何订单。 将有序数据传递给它以进行初始化的唯一方法是传递一个列表(或者更一般地说是一个可迭代的)键 – 值对,就像你在前两个例子中那样。 正如你所链接的文档所说的那样,OrderedDict在传递关键字参数或dict参数时不能访问任何顺序,因为在OrderedDict构造函数看到之前,任何顺序都被删除了。

请注意,在上例中使用列表理解不会改变任何内容。 OrderedDict([(i,i) for i in l])OrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')]) 。 列表理解被评估并创build列表并被传入; OrderedDict不知道它是如何创build的。

 # An OD is represented by a list of tuples, so would this work? d = OrderedDict([('b', 2), ('a', 1)]) 

是的,这将工作。 根据定义,列表总是按照它所表示的方式排列。 这也适用于列表理解,生成的列表与数据提供的方式相同(即列表中的来源将是确定性的,来源于setdict而不是太多)。

如何validationOrderedDict实际维护订单。 由于字典具有不可预知的顺序,如果我的testing向量幸运地具有与字典的不可预知的顺序相同的初始顺序呢? 例如,如果我写d = OrderedDict({'a':1, 'b':2}) ,而不是d = OrderedDict({'b':2, 'a':1}) d = OrderedDict({'a':1, 'b':2}) ,我可以错误地得出结论订单被保留。 在这种情况下,我发现dict是按字母顺序排列的,但这可能并不总是如此。 即,使用一个反例来validation一个数据结构是否保留了顺序,或者没有重复尝试testing向量直到一个中断,这是一个可靠的方法。

您可以保留2元组的源列表作为参考,并在进行unit testing时将其用作testing用例的testing数据。 遍历它们并确保订单得以维护。