0

How Do I sort a dict of dict in python??

I have a dictionary :

d =     {
       1: {2: 30, 3: 40, 4: 20, 6: 10},
       2: {3: 30, 4: 60, 5: -60}, 
       3: {1: -20, 5: 60, 6: 100}, 
       }

How can I get the sorted (reverse) dict based on their values ?? How can I get the output like:

d = {
           1: {3: 40, 2: 30, 4: 20, 6: 10},
           2: {4: 60, 3: 30, 5: -60}, 
           3: { 6: 100, 5: 60,1: -20}, 
  }
learner
  • 499
  • 1
  • 5
  • 13

2 Answers2

0

If you want order you need an OrderedDict of OrderedDicts, by chance the outer dict is in sorted order but normal dicts have no order:

from collections import OrderedDict

d =     {
       1: {2: 30, 3: 40, 4: 20, 6: 10},
       2: {3: 30, 4: 60, 5: -60},
       3: {1: -20, 5: 60, 6: 100},
       }
keys = sorted(d.keys()) # sort outer dict keys
o = OrderedDict()
for k in keys: # loop over the sorted keys
    # make an orderedDict out of the sorted items from each sub dict.
    o[k] = OrderedDict((k,v) for k,v in sorted(d[k].items(),key=lambda x:x[1],reverse=True))
print(o)

OrderedDict([(1, OrderedDict([(3, 40), (2, 30), (4, 20), (6, 10)])), (2, OrderedDict([(4, 60), (3, 30), (5, -60)])), (3, OrderedDict([(6, 100), (5, 60), (1, -20)]))])
Padraic Cunningham
  • 176,452
  • 29
  • 245
  • 321
0

What Padraic did, more compacted:

sort_vals = lambda d: OrderedDict(sorted(d.items(), key=lambda pair: pair[1], reversed=True))

d = dict((k, sort_vals(sub_dict)) for k, sub_dict in d.items())

(Not tested)

Javier
  • 2,752
  • 15
  • 30