how to efficiently get the k bigger elements of a list in python
Use nlargest from heapq module
from heapq import nlargest
lst = [9,1,6,4,2,8,3,7,5]
nlargest(3, lst) # Gives [9,8,7]
You can also give a key to nlargest in case you wanna change your criteria:
from heapq import nlargest
tags = [ ("python", 30), ("ruby", 25), ("c++", 50), ("lisp", 20) ]
nlargest(2, tags, key=lambda e:e[1]) # Gives [ ("c++", 50), ("python", 30) ]
The simple, O(n log n) way is to sort the list then get the last k elements.
The proper way is to use a selection algorithm, which runs in O(n + k log k) time.
Also, heapq.nlargest
takes O(k log n) time on average, which may or may not be good enough.
(If k = O(n), then all 3 algorithms have the same complexity (i.e. don't bother). If k = O(log n), then the selection algorithm as described in Wikipedia is O(n) and heapq.nlargest
is O(n log log n), but double logarithm is "constant enough" for most practical n that it doesn't matter.)
l = [9,1,6,4,2,8,3,7,5]
sorted(l)[-k:]