2013-07-23 127 views
2

此循環的想法是遍歷列表。如果某個對象的某個屬性不是OrderedDict的關鍵字,則會添加它。它是對象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)
爲什麼會發生這種情況,如何解決?

+3

如果沒有在'someList'裏面有什麼**是不可能**的。可推測的第一個'object.DATE'值是'(02/13)'.. –

+2

OrderedDict保存順序對象添加到它們,所以必須是添加'object.DATE'的順序。每次執行'myOrderedDict [object.DATE] = []'語句時,您都可以輕鬆地驗證通過打印或記錄某些內容的順序。另外,你如何印刷其內容? – martineau

+0

我同意Martijn和martineau--也許你認爲它應該是一個「排序字典」,但是你按照插入它們的順序(這是記錄的行爲)獲取元素。如果你想要它排序,然後做類似排序(myOrderedDict.items()) –

回答

6

看來您期望OrderedDict中的項目是按鍵排序的,但情況並非如此。 OrderedDict按訂單項目添加到訂單中。從PEP 372 FAQ:

是否OrderedDict支持其他排序順序,如按字母順序排列?

不需要那些想要不同的排序順序真的需要使用另一種技術。 OrderedDict全部是關於錄製插入順序的。如果任何其他命令是有趣的,那麼另一個結構(比如內存中的dbm)可能更適合。

2

一種OrderedDict是記住的鍵首先被插入的順序的字典。因此,字典的順序是插入的密鑰的順序。它不會通過密鑰對字典進行排序。

1

OrderedDict會記住插入順序,只需使用常規詞典並在打印之前對其進行分類。你可以這樣

sorted(myDict, key=myDict.get) 
0

我已經嘲笑了什麼,我覺得你越來越爲例按字母順序排列你的快譯通,和OrderedDict確實保留的順序,你插入,這可能不是你想要的東西。在這種情況下,您可以查看已排序()的解決方案。這應該澄清:

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

的純Python sortedcontainers moduleSortedDict類型,它可以幫助你。它按照排序順序自動維護字典密鑰,並且有詳細的記錄和測試。您可以使用它就像你的字典:

>>> 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頁面。

0

這個功能已經在ruamel.ordereddict(可從PyPI中)爲Python 2,自2007年以來:

from ruamel.ordereddict import sorteddict 

(這是一個快速的C語言實現,免責聲明:我THA牛逼包的作者)。