Dictionaries do not have any inherent order. Or, rather, their inherent order is “arbitrary but not random”, so it doesn’t do you any good.
In different terms, your d and your e would be exactly equivalent dictionaries.
What you can do here is to use an OrderedDict:
from collections import OrderedDict
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'125': { 'key1': 7, 'key2': 44, 'key3': 9 },
}
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3']))
d_descending = OrderedDict(sorted(d.items(),
key=lambda kv: kv[1]['key3'], reverse=True))
The original d has some arbitrary order. d_ascending has the order you thought you had in your original d, but didn’t. And d_descending has the order you want for your e.
If you don’t really need to use e as a dictionary, but you just want to be able to iterate over the elements of d in a particular order, you can simplify this:
for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True):
do_something_with(key, value)
If you want to maintain a dictionary in sorted order across any changes, instead of an OrderedDict, you want some kind of sorted dictionary. There are a number of options available that you can find on PyPI, some implemented on top of trees, others on top of an OrderedDict that re-sorts itself as necessary, etc.