Having stashed a bunch of data in a python dict, one often needs a quick way to extract the n largest. Inconveniently for the particular problem I was working on, the key value for the dict was an object and the associated value was a floating-point weight. A quick-and-dirty method is to use insert all the dict-keys into a heap, using the dict-value as the heap-key Fortuitously, Python has both a heap module and convenient functions for using it in exactly this way.
import heapq
def dict_nlargest(d,n):
return heapq.nlargest(n ,d, key = lambda k: d[k])
d = { 'a':10.0, 'b':2.0, 'c':5.0, 'd':3.0, 'e':15.0 }
print dict_nlargest(d,3)
Which neatly prints a list of the keys associated with the three largest values:
['e', 'a', 'c']
The heapq.nlargest() function can also use arbitrary object attributes as keys, as well, by supplying a one-argument function to the named parameter key. (This is the role of the lambda in the examples above and below.)
import heapq
class Toy:
def __init__Toy(self, s, i, f):
self.s = s
self.i = i
self.f = f
l = [ Toy('a', 10, 4.4), Toy('b', 4, 12.0),
Toy('c', 2, 20.0), Toy('d', 1, 5.0) ]
# largest by the 'f' attribute
print heapq.nlargest(2, l, key = lambda o: o.f)
# largest by the 'i' attribute
print heapq.nlargest(2, l, key = lambda o: o.i)
This is fine for a one-off, but you’ll likely want to maintain this information in a data structure if this you’ll be performing this operation multiple times on a large collection.