2015-12-20 5 views
0

Я использую этот код для формирования словаря:Странное поведение словаря сортировочного

tt_data[dt] = {} 
for hour in range(work_begins, work_ends, 2): 
    tt_data[dt][hour] = '' 
    if Rehearsal.objects.filter(dt__year=dt.year, dt__month=dt.month, dt__day=dt.day, dt__hour=hour).exists(): 
     tt_data[dt][hour] = Rehearsal.objects.get(dt__year=dt.year, dt__month=dt.month, 
                dt__day=dt.day, dt__hour=hour) 

Странная вещь, когда «work_begins» равен 14, то этот элемент идет к концу Dict:

enter image description here

Любая помощь приветствуется.

+3

Значения 'tt_data' являются регулярными словарями, а не упорядоченными словарями, правильно? Регулярные словари неупорядочены. –

+1

Ключами в вашем OrderedDict являются даты. Вторая строка захвата экрана отключена, но она отображает список двухэлементных кортежей. Первый элемент - это ключ, который является объектом даты, второй элемент - это значение, которое является dict. Этими ключами/датами являются вещи, которые хранятся в порядке, а не значения/dicts, связанные с этими ключами. Если вы хотите, чтобы значения/dicts поддерживались в порядке, они должны быть созданы как OrderedDicts. – 7stud

+1

Это прямо там: 'tt_data [dt] = {}' Почему вы думаете, что '{}' создает OrderedDict? Строка: 'tt_data [dt] [hour] = ...' вставляет записи в '{}'. – 7stud

ответ

0

Спасибо, это просто редактировать решает эту проблему:

-  tt_data[dt] = {} 
+  tt_data[dt] = OrderedDict() 
-1

Как указано в нескольких комментариях, tt_data[dt] стандартный словарь питона, который является неупорядоченным. (См. https://docs.python.org/3.5/tutorial/datastructures.html#dictionaries) для более подробной информации.

Поэтому, хотя в других примерах datetime выглядит порядок, это не гарантировано.

Несколько человек также обсудили внешний OrderedDict (tt_data), который будет храниться в порядке. Это справедливо только в том смысле, что он будет храниться в том порядке, в котором он создан, а не в каком-то упорядоченном порядке. Например, если вы добавите 20/11/2015, а затем добавьте 19/11/2015, он не будет перенаправлять их в соответствии с датами.

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