Print a dict sorted by values

Each Answer to this Q is separated by one/two green lines.

I’m basically trying to iterate through a dict and print out the key / values from largest value to lowest. I have been searching this site and a lot of people are using lambda but I’m not really sure how its working so I’m trying to avoid it for now.

dictIterator = iter(sorted(bigramDict.iteritems()))
for ngram, value in dictIterator:
    print("There are " + str(value) + " " + ngram)

Looking over the code above I assumed it would make an iterator which returns the key/value pairs in order from largest to smallest but it’s not.

Can anyone see what the problem is? or another method of doing this?

One can take advantage of the fact that sort works on tuples by considering the first element as more important than the second etc:

d = { "a":4, "c":3, "b":12 }
d_view = [ (v,k) for k,v in d.iteritems() ]
d_view.sort(reverse=True) # natively sort tuples by first element
for v,k in d_view:
    print "%s: %d" % (k,v)

Output:

b: 12
a: 4
c: 3

EDIT: one-liner, generator expression:

sorted( ((v,k) for k,v in d.iteritems()), reverse=True)

Output:

[(12, 'b'), (4, 'a'), (3, 'c')]

You can use the key parameter of sorted to sort by the 2nd item:

>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> for k, v in sorted(d.items(), key=itemgetter(1)):
    print k, v


c 3
a 4
b 12
>>> 

EDIT: one-liner, in opposite order:

>>> d = {"a": 4, "c": 3, "b": 12}
>>> [(k, v) for k, v in sorted(d.items(), key=lambda x: x[1], reverse=True)]
[('b', 12), ('a', 4), ('c', 3)]
>>> 

>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> lst = sorted(d.iteritems(), key=itemgetter(1))
>>> for t in lst: print '%s : %d' % (t[0], t[1])
... 
c : 3
a : 4
b : 12

Here’s a solution with Python 3:

d = { "a":4, "c":3, "b":12 }
sorted(((v, k) for k, v in d.items()), reverse=True)

d = { "a":4, "c":3, "b":12 }
for v in sorted( d.values() ):
    for key in d:
        if d[ key ] == v:
            print key, v
            break


The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .