An OrderedDict is ordered by the order items are added to it.
So why is this happening?
I have two dictionaries:
d_names
d_new_names
The second is a re-ordered version of the first. This is because I understand that I cannot re-order an existing OrderedDict - I need to create a new one.
To do this I first create an ordered list:
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
Then I create and fill the first level of the new dictionary:
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]
Then I create the second level and fill the dictionary:
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]
When I wrote the dictionary contents to a file I was surprised to see this order:
writing week:13
writing week:15
writing week:14
writing week:16
That is, week 15 precedes week 14.
Upon investigation (printing the OrderedDict each time through the second loop) I found this (number corresponds to loop):
- week 13 added; order: 13
- week 14 added; order: 13, 14
- week 15 added; order: 13, 15, 14
- week 16 added; order: 13, 15, 14, 16
Conclusion: during creation and insertion of elements into the OrderedDict, the elements are being inserted in the wrong order. I did not think that was possible.
Can anyone explain what is happening and how I resolve this?