import itertools def groupby(it, key_fn=lambda x: x, group_fn=lambda x: x): for k, g in itertools.groupby(sorted(it, key=key_fn), key=key_fn): yield k, group_fn(g)