7
from collections import OrderedDict
import pprint

menu = {"about" : "about", "login" : "login", 'signup': "signup"}

menu = OrderedDict(menu)
pprint.pprint(menu.items())

import sys
sys.exit()

The output is:

[('about', 'about'), ('signup', 'signup'), ('login', 'login')]

So, the order is not preserved even with the use of OrderedDict. I know the dictionaries don't preserve the initial order by default, and all those things. But I want to learn why the OrderedDict is not working.

smci
  • 32,567
  • 20
  • 113
  • 146
user455318
  • 3,280
  • 12
  • 41
  • 66
  • 4
    This is an important gotcha (mistakenly assigning first to a dict then OrderedDict) which many of us independently discovered and scratched our heads over... this question is perfectly legitimate, documents an important gotcha and should not have been downvoted. **Deeply counterintuitively, an OrderedDict must be initialized/assigned from a list of tuples, not from a dict**, in order to preserve the right order :) – smci Nov 11 '17 at 00:41
  • Possible duplicate of [Converting dict to OrderedDict](https://stackoverflow.com/questions/15711755/converting-dict-to-ordereddict) – Ilja Everilä Feb 28 '18 at 21:13

2 Answers2

13

By putting the items in a (non-ordered) dict and constructing the OrderedDict from that, you've already discarded the original order. Construct the OrderedDict from a list of tuples, not a dict.

Sneftel
  • 40,271
  • 12
  • 71
  • 104
1

Please find code snippet below

>>> from collections import OrderedDict
>>> listKeyVals = [(1,"One"),(2,"Two"),(3,"Three"),(4,"Four"),(5,"Five")]
>>> x = OrderedDict(listKeyVals)
>>> x
OrderedDict([(1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four'), (5, 'Five')])
>>> 

I suggest you to vist examples from my article

https://techietweak.wordpress.com/2015/11/11/python-collections/