from operator import attrgetter def ranker(iterable, key=attrgetter('points'), rank=0): delta = 1 last = None for item in iterable: new = key(item) if new != last: rank += delta delta = 0 delta += 1 yield rank, item last = key(item)