2013-07-23 3 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 заказываются по клавише, что не так. Заказ упорядочен по заказу элементов добавляется к нему. Из PEP 372 FAQ:

ли OrderedDict поддерживает альтернативные порядки сортировки, такие как алфавитный?

Нет. Те, кому нужны разные порядки сортировки, действительно должны использовать другую технику. OrderedDict - все о порядке ввода записи. Если какой-либо другой порядок представляет интерес, то другая структура (например, dbm в памяти), вероятно, лучше подходит.

2

Упорядоченный дикт, который помнит порядок ввода ключей. Таким образом, порядок dict - это порядок вставленного ключа. Он не будет сортировать ваш dict ключом.

1

OrderedDict помнит порядок вставки, просто используйте обычный dict и сортируйте его перед его печатью. Вы можете отсортировать Dict в алфавитном порядке, как этот

sorted(myDict, key=myDict.get) 
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

Чисто-Python sortedcontainers module имеет тип 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)'] 

Отсортированное модуль контейнеры очень быстро и имеет performance comparison страницу с критериями в отношении альтернативных реализаций.

0

Эта функция была в ruamel.ordereddict (доступен из PyPI) для Python 2, начиная с 2007 года:

from ruamel.ordereddict import sorteddict 

(это быстрая реализация C, отказ от ответственности: я являюсь автором т пакета тха).

Смежные вопросы