OrderedDict没有保持秩序

时间:2013-07-23 15:37:08

标签: python python-2.7 ordereddictionary

这个循环的想法是迭代列表。如果对象的某个属性不是OrderedDict的键,则会添加它。它是一个对象列表的字典

for object in someList:
  if object.DATE not in myOrderedDict:
     myOrderedDict[object.DATE]=[]
  myOrderedDict[object.DATE].append(object)

虽然它似乎确实使OrderedDict大部分正确,但它在打印时最终会出现故障。它不像(01/13) (02/13) (03/13)那样更像(02/13) (03/13) (01/13) 为什么会发生这种情况?如何解决?

6 个答案:

答案 0 :(得分:6)

您似乎希望按键排序OrderedDict中的项目,但实际情况并非如此。 OrderedDict按订单商品的顺序排序。来自PEP 372常见问题解答:

  

OrderedDict是否支持其他排序顺序,例如字母?

     

没有。那些想要不同排序顺序的人真的需要使用另一种技术。 OrderedDict是关于记录插入顺序的。如果感兴趣任何其他顺序,那么另一个结构(如内存中的dbm)可能更适合。

答案 1 :(得分:5)

纯Python sortedcontainers moduleSortedDict类型可以帮助您。它按排序顺序自动维护dict键,并且有详细记录和测试。你就像使用dict一样使用它:

>>> from sortedcontainers import SortedDict
>>> mySortedDict = SortedDict()
>>> for object in someList:
>>>     if object.DATE not in mySortedDict:
>>>         mySortedDict[object.DATE]=[]
>>>     mySortedDict[object.DATE].append(object)
>>> list(mySortedDict.keys())
['(01/13)', '(02/13)', '(03/13)']

已排序的容器模块非常快,并且有一个performance comparison页面,其中包含针对其他实现的基准。

答案 2 :(得分:2)

OrderedDict是一个dict,它记住了第一次插入密钥的顺序。因此dict的顺序是插入密钥的顺序。它不会通过密钥对您的字典进行排序。

答案 3 :(得分:1)

OrderedDict会记住插入顺序,只需使用常规字典并在打印之前对其进行排序。你可以像这样按字母顺序对你的字典进行排序

sorted(myDict, key=myDict.get)

答案 4 :(得分:0)

我已经模拟了一个我认为你得到的例子,OrderedDict确实保留了你插入的顺序。这可能不是你想要的。在这种情况下,您可以查看sorted()解决方案。这应该澄清:

import collections

class ob():
    def __init__(self, d, v):
        self.DATE = d
        self.VALUE = v

orderedDict = collections.OrderedDict()
normalDict = {}

someList = [ob('02/13', 2), ob('03/13',3), ob('04/13', 4) , ob('01/13', 5), ob('02/13', 15)]

for a in someList:
  if a.DATE not in orderedDict:
     orderedDict[a.DATE]=[]
     normalDict[a.DATE]=[]
  orderedDict[a.DATE].append(a)
  normalDict[a.DATE].append(a)

orderedDictSorted = collections.OrderedDict(sorted(orderedDict.items()))

print 'Ordered Dict'
print orderedDict.keys()
print 'Dict'
print normalDict.keys()
print 'Ordered Dict Sorted'
print orderedDictSorted.keys()

答案 5 :(得分:0)

自2007年以来,此功能已在{2}的ruamel.ordereddict(可从PyPI获得)中获得:

from ruamel.ordereddict import sorteddict

(这是一个快速的C实现,免责声明:我是tha t package的作者)。