28
votes

I have a dictionary

{'a': 'first', 'b': 'second'}

However, I need the dictionary in a different order:

{'b': 'second', 'a': 'first'}

What is the best way to do this?

3
Ok, my fault, I'll read documentation. I just print it and it was out by specific order by chance. I thought it has something to do with a way it is written. Like php's array. - Qiao
@Qiao This is actually a good question. I was like "oh, that'll be easy to answer with the documentation" -- it isn't. This "trivial fact" seems to be assumed knowledge in most places. The best I can find (in OrderedDict, chapter 8.3) is "An OrderedDict is a dict that remembers the order that keys were first inserted.". - user166390
Ahh, there it is: "It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique (within one dictionary)." from 5.5 Data Structures in the Tutorial. - user166390
-1. Searching StackOverflow for "python dictionary order" easily finds the answer. You should at least try something before posting to StackOverflow. - Steven Rumbalski

3 Answers

41
votes

Dictionaries are not ordered. So there is no way to do it.

If you have python2.7+, you can use collections.OrderedDict - in this case you could retrieve the item list using .items() and then reverse it and create a new OrderedDict from the reversed list:

>>> od = OrderedDict((('a', 'first'), ('b', 'second')))
>>> od
OrderedDict([('a', 'first'), ('b', 'second')])
>>> items = od.items()  # list(od.items()) in Python3
>>> items.reverse()
>>> OrderedDict(items)
OrderedDict([('b', 'second'), ('a', 'first')])

If you are using an older python version you can get a backport from http://code.activestate.com/recipes/576693/

7
votes

Dictionaries don't have order.

You can get the keys, order them however you like, then iterate the dictionary values that way.

keys = myDict.keys()
keys = sorted(keys)  # order them in some way
for k in keys:
   v = myDict[k]
4
votes

You can't; dicts are unsortable. Use an OrderedDict if you need an ordered dictionary.