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
for
declaración para iterar infinitamente, o puede llamarnext()
para obtener el siguiente valor único del iterador del generador:fuente
while True
medios para repetir para siempreitertools.cycle
es una mejor respuesta. Esto muestra cómo podría escribir la misma funcionalidad siitertools
no está disponible :)itertools.cycle
hace? ¿O el generador simple sería un diseño más eficiente en memoria? Según loscycle
documentos :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
implica que la entrada iterable se conviertelist
antes de que se inicie su generador, yaiterable
que 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
n
tiempos, implemente lancycles
receta de itertools :fuente