2

这个循环的想法是遍历一个列表。如果对象的某个属性不是 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).
为什么会发生这种情况,如何解决?

4

6 回答 6

6

您似乎希望 anOrderedDict中的项目按键排序,但事实并非如此。OrderedDict 按添加到其中的订单项排序。来自PEP 372常见问题解答:

OrderedDict 是否支持替代排序顺序,例如字母顺序?

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

于 2013-07-23T15:47:10.690 回答
5

纯 Python 的sortedcontainers 模块有一个SortedDict类型可以帮助你。它按排序顺序自动维护 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)']

排序容器模块非常快,并且有一个性能比较页面,其中包含针对替代实现的基准。

于 2014-08-11T19:04:19.900 回答
2

OrderedDict 是一个 dict,它记住第一次插入键的顺序。所以字典的顺序就是插入键的顺序。它不会按键对您的字典进行排序。

于 2013-07-23T15:47:13.640 回答
1

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

sorted(myDict, key=myDict.get)
于 2013-07-23T15:48:45.550 回答
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()
于 2013-07-23T16:03:15.313 回答
0

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

from ruamel.ordereddict import sorteddict

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

于 2016-05-02T07:06:41.420 回答