Necesito iterar sobre una lista circular, posiblemente muchas veces, cada vez comenzando con el último elemento visitado.
El caso de uso es un grupo de conexiones. Un cliente solicita una conexión, un iterador comprueba si la conexión apuntada está disponible y la devuelve; de lo contrario, realiza un bucle hasta que encuentra una que esté disponible.
¿Hay alguna forma ordenada de hacerlo en Python?

pool.next()para obtener el siguiente elemento único del ciclonext(iterator)(que por cierto también funciona bien en Python 2.xy, por lo tanto, es la forma canónica que debe usarse). Consulte ¿Es generator.next () visible en python 3.0? para una explicación más detallada. Actualicé mi respuesta en consecuencia.La respuesta correcta es usar itertools.cycle . Pero supongamos que la función de biblioteca no existe. ¿Cómo lo implementaría?
Utilice un generador :
Luego, puede usar una
fordeclaración para iterar infinitamente, o puede llamarnext()para obtener el siguiente valor único del iterador del generador:fuente
while Truemedios para repetir para siempreitertools.cyclees una mejor respuesta. Esto muestra cómo podría escribir la misma funcionalidad siitertoolsno está disponible :)itertools.cyclehace? ¿O el generador simple sería un diseño más eficiente en memoria? Según loscycledocumentos :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).cycleimplica que la entrada iterable se conviertelistantes de que se inicie su generador, yaiterableque solo es "buena para una pasada sobre el conjunto de valores".O puedes hacer esto:
imprime abcdefab c ... para siempre
fuente
puedes lograr esto con
append(pop())loop:o
for i in range()bucle:o simplemente:
todos los cuales imprimen:
de los tres, sería propenso al método append (pop ()) como función
fuente
Necesita un iterador personalizado; adaptaré el iterador de esta respuesta .
fuente
Si desea ciclos de
ntiempos, implemente lancyclesreceta de itertools :fuente