Una clase sin __repr__ te hace perder tiempo desde el momento en que existe. repr es para ti, str es para quien lee, y solo uno de los dos tiene un respaldo razonable.
self es el nombre de un parámetro, no una palabra reservada. __init__ no crea el objeto. Y un atributo de clase es compartido hasta el momento en que asignas a través de una instancia.
La mayoría de las clases en Python debieron ser funciones. La prueba no es «¿esto es un sustantivo?», sino si existe un estado inválido que la clase pueda impedir.
El bucle que estás por escribir probablemente ya está en la biblioteca estándar. islice, chain, pairwise y groupby cubren casi todos, y groupby tiene una regla que no te puedes saltar.
Un generador es un iterador que escribes como una función normal. Se pausa en yield, retoma donde se quedó, y nunca construye la lista que estabas por construir.
Un bucle for son tres pasos que podrías escribir a mano. Una vez que los ves, el error de que algo salga vacío la segunda vez deja de ser una sorpresa y pasa a ser evidente.
Dos funciones incorporadas que reemplazan el contador que sigues escribiendo a mano y la indexación que sigues equivocando. Una de las dos además tira datos a la basura sin avisarte.