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

标签 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])

问题:

  • OrderedDict 是否会保留初始化时传递的元组列表或元组元组或列表元组或列表列表等的顺序(第 2 和第 3 个示例以上)?

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

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

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

最佳答案

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

请注意,在上一个示例中使用列表推导不会改变任何内容。 OrderedDict([(i,i) for i in l])OrderedDict([('b', 'b'), ('a', 'a' ), ('c', 'c'), ('aa', 'aa')])。列表推导被评估并创建列表并传入; OrderedDict 对它是如何创建的一无所知。

关于python - 使用其构造函数初始化 OrderedDict 以使其保留初始数据顺序的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25480089/

相关文章:

ios - 如何在 Swift 中搜索字典内部

python - 将从第一个表获取的行值与第二个表的列名匹配,无需循环

python - 加载json文件时如何将所有列表转换为集合

java 二维数组二次​​排序

python - Pandas Dataframe 按列排序

c - 用于对多边形轮廓中的顶点进行排序的线性时间算法

python - pip安装错误: cannot import name 'unpack_url'

python - 获取字符串形式的参数名称 - Python

python-3.x - 无法将网络抓取输出作为字典返回

F#:如何将 Map 与集合一起使用(如正则表达式匹配)?