import heapq def get_topk(l, k): counts = {} for i in l: n = int(i) counts[n] = counts.setdefault(n, 0) + 1 h = [(count,n) for (n,count) in list(counts.items())[:k]] heapq.heapify(h) for n, count in counts.items()[k:]: min_count, min_n = h[0] if count > min_count: heapq.heapreplace(h, (count, n)) h.sort(reverse=True) return h