2016-04-28 1 views
1

An OrderedDict is ordered by the order items are added to it.Как я могу помешать OrderedDict вставлять элемент, а не добавлять его в конец?

Так почему же это происходит?

У меня есть два словаря:

d_names 
d_new_names 

Вторым является переупорядочено версией первого. Это потому, что я понимаю, что I cannot re-order an existing OrderedDict - I need to create a new one.

Для этого я сначала создать упорядоченный список:

l_new_names = [] 
for s_number in d_names: 
    for s_week_number in d_names[s_number]: 
     l_new_names.append([s_number, s_week_number]) 

print "l_new_names before sort = %s" % l_new_names 
l_new_names.sort() 
print "l_new_names after sort = %s" % l_new_names 

Затем я создаю и заполнение первого уровня нового словаря:

d_new_names = ordereddict.OrderedDict() 

for s_number, _ in l_new_names: 
    if s_number in d_new_names: 
     print "NOT creating d_new_names[%s]" % s_number 
    else: 
     print "creating d_new_names[%s]" % s_number 
     d_new_names[s_number] = {} 
     d_new_names[s_number][NAME] = d_names[s_number][NAME] 

Затем я создаю второй уровень и заполнить словарь:

for s_number, s_week_number in l_new_names: 
    d_new_names[s_number][s_week_number] = {} 
    d_new_names[s_number][s_week_number][DATE] = d_names[s_number][s_week_number][DATE] 
    d_new_names[s_number][s_week_number][PRICE] = d_names[s_number][s_week_number][PRICE] 

Когда я написал содержание словаря в файл, я был удивлен, увидев это Последовательность:

writing week:13 
writing week:15 
writing week:14 
writing week:16 

То есть, неделя 15 предшествует неделя 14.

После исследования (печатание OrderedDict каждый раз через второй петли) Я нашел это (число соответствует петле):

  1. неделя 13 добавлено; заказ: 13
  2. неделя 14 добавлено; заказ: 13, 14
  3. неделя 15 добавлено; заказываются: 13, , 14
  4. неделя 16 добавлено; Последовательность: 13, 15, 14, 16

Вывод: во создания и вставки элементов в OrderedDict, элементы вставляются в неправильном порядке. Я не думал, что это возможно.

Может ли кто-нибудь объяснить, что происходит и как я это разрешаю?

+0

Пожалуйста, разместите образцы данных для запуска кода. Этот код не является минимальным, чтобы воспроизвести проблему – MohitC

+0

Что-то еще не так; упорядоченные словари очень поддерживают первоначальный порядок вставки. –

ответ

3

Вы вставляете номер недели в обычный словарь, не упорядоченный словарь:

d_new_names[s_number] = {} 

Здесь d_new_names в упорядоченном словаре, поэтому s_number значения содержатся в порядке вставки, но ключи относятся к нормальным словарям ,

Позже вы используете эти нормальные словари для хранения каждой недели информации:

d_new_names[s_number][s_week_number] = {} 

Ваших s_week_number номера недель, таким образом, не сохраняются в порядке вставки, но следовать произвольному порядку нормального словаря вместо.

+0

Вот и все! Я изменил две строки, которые вы указываете: 'd_new_names [s_po_number] = ordereddict.OrderedDict()' и 'd_new_names [s_po_number] [s_week_number] = ordereddict.OrderedDict()', и теперь это работает, спасибо большое. (6 минут от вопроса до решения - лучше всего я видел с одним из моих вопросов! :)) [И я бы не нашел это сам, ура!] – Wikis

+1

@Wikis у вас был полный MCVE, который я мог бы сделал это 3, я уверен. :-) –

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