python dictionary sorting in descending order based on values
Question: I want to sort this dictionary d based on value of sub key key3 in descending
order. See below:

    
    
    d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
          '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
          '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
        }
    

So final dictionary would look like this.

    
    
    d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
          '124': { 'key1': 6, 'key2': 56, 'key3': 6 },
          '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
        }
    

My approach was to form another dictionary e from d, whose key would be value
of key3 and then use reversed(sorted(e)) but since value of key3 can be same,
so dictionary e lost some of the keys and their values. makes sense?

How I can accomplish this? This is not a tested code. I am just trying to
understand the logic.


Answer: [Dictionaries do not have any inherent
order](http://docs.python.org/3/library/stdtypes.html#dictionary-view-
objects). 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`](http://docs.python.org/3/library/collections.html#ordereddict-
objects):

    
    
    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_ascending` has the
order you want for your `e`.

* * *

If you don't really need to use `e` as a dictionary, 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.

