I'm trying to create an OrderedDict object but no sooner do I create it, than the elements are all jumbled.
This is what I do:
from collections import OrderedDict
od = OrderedDict({(0,0):[2],(0,1):[1,9],(0,2):[1,5,9]})
The elements don't stay in the order I assign
od
OrderedDict([((0, 1), [1, 9]), ((0, 0), [2]), ((0, 2), [1, 5, 9])])
docs.python.org doesn't have an example and I can't figure out why the order is getting jumbled. Any help is greatly appreciated.
Your problem is that you are constructing a
dict
to give the initial data to theOrderedDict
- thisdict
doesn't store any order, so the order is lost before it gets to theOrderedDict
.The solution is to build from an ordered data type - the easiest being a
list
oftuple
s:It's worth noting that this is why
OrderedDict
uses the syntax it does for it's string representation - string representations should try to be valid Python code to reproduce the object where possible, and that's why the output uses a list of tuples instead of a dict.Edit: As of Python 3.6,
kwargs
is ordered, so you can use keyword arguments instead, provided you are on an up-to-date Python version.As of 3.7, this is also true for
dict
s (it was for CPython in 3.6, but the language spec didn't specify it, so usingOrderedDict
was still required for compatibility). This means if you can assume a 3.7+ environment, you can often dropOrderedDict
altogether, or construct one from a regulardict
if you need a specific feature (e.g: order to matter for equality).