¿Cuál es la forma más pythonica de identificar duplicados consecutivos en una lista?

Tengo una lista de enteros y quiero poder identificar bloques de duplicados contiguos: es decir, quiero producir una lista de duplicados que conserva el orden donde cada duple contiene (int_in_question, número de ocurrencias).

Por ejemplo, si tengo una lista como:

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6] 

Quiero que el resultado sea:

 [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

Tengo una forma bastante sencilla de hacer esto con un bucle for, un temp y un contador:

 result_list = [] current = source_list[0] count = 0 for value in source_list: if value == current: count += 1 else: result_list.append((current, count)) current = value count = 1 result_list.append((current, count)) 

Pero realmente me gustan los lenguajes de progtwigción funcionales de python, y me gustaría poder hacer esto con una simple expresión de generador. Sin embargo, me resulta difícil mantener los recuentos cuando se trabaja con generadores. Tengo la sensación de que un proceso de dos pasos podría llevarme allí, pero por ahora estoy perplejo.

¿Hay una forma particularmente elegante / pythonica de hacer esto, especialmente con generadores?

 >>> from itertools import groupby >>> L = [0, 0, 0, 3, 3, 2, 5, 2, 6, 6] >>> grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)] >>> # Or (k, len(list(g))), but that creates an intermediate list >>> grouped_L [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

Pilas incluidas , como dicen.

Sugerencia para usar sum y expresión generadora de JBernardo; Ver comentario.