使用其构造函数初始化OrderedDict以便保留初始数据顺序的正确方法?

cli*_*ick 109 python sorting dictionary ordereddictionary

初始化有序字典(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])
Run Code Online (Sandbox Code Playgroud)

题:

  • 将一个OrderedDict保存的元组的列表的顺序,或元组或列表或列表等的列表的元组的元组通过在初始化的时间(2楼和3上面的例子)?

  • 如何验证是否OrderedDict实际维护订单?由于a dict具有不可预测的顺序,如果我的测试向量幸运地具有与dict的不可预测顺序相同的初始顺序,该怎么办?例如,如果不是d = OrderedDict({'b':2, 'a':1})我写d = OrderedDict({'a':1, 'b':2}),我可能错误地断定订单被保留.在这种情况下,我发现a dict按字母顺序排序,但可能并非总是如此.使用反例来验证数据结构是否保留顺序的可靠方法是什么,没有重复尝试测试向量直到中断?

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

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

Bre*_*arn 81

OrderedDict将保留它有权访问的任何订单.将有序数据传递给它以进行初始化的唯一方法是传递一个列表(或更常见的是可迭代的)键值对,如前两个示例所示.正如您链接的文档所述,当您传递关键字参数或dict参数时,OrderedDict无法访问任何订单,因为在OrderedDict构造函数看到之前,任何订单都会被删除.

请注意,在上一个示例中使用列表推导不会改变任何内容.OrderedDict([(i,i) for i in l])和之间没有区别OrderedDict([('b', 'b'), ('a', 'a'), ('c', 'c'), ('aa', 'aa')]).评估列表推导并创建列表并将其传入; OrderedDict对它的创建方式一无所知.


met*_*ter 70

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

是的,那会有效.根据定义,列表始终按其表示的方式排序.这也适用于列表理解,生成的列表与提供数据的方式相同(即列表中的源是确定性的,源自setdict不是这样).

如何验证是否OrderedDict实际维护订单.由于dict有一个不可预测的顺序,如果我的测试向量幸运地具有与dict的不可预测的顺序相同的初始顺序怎么办?例如,如果不是d = OrderedDict({'b':2, 'a':1})我写d = OrderedDict({'a':1, 'b':2}),我可能错误地断定订单被保留.在这种情况下,我发现a dict是按字母顺序排列的,但可能并非总是如此.即,使用计数器示例来验证数据结构是否保持顺序或不重复尝试测试向量直到一个中断是一种可靠的方法.

保留2元组的源列表以供参考,并在进行单元测试时将其用作测试用例的测试数据.迭代它们并确保维持订单.

  • 见[`__hash__`](http://docs.python.org/dev/reference/datamodel.html#object.__hash__).特别是关于`str`类型. (2认同)