es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo avanzar de manera elegante un iterador hasta que esté vacío en Python?

Si tengo un iterador foo y una función progress que lo avanza en alguna cantidad arbitraria (pero con la garantía de que nunca arrojará StopIteration), ¿cómo puedo seguir llamando a progress hasta que foo esté vacío?

Parece que iter([]) es verdadero.

Este es mi mejor intento:

from itertools import islice
import copy

# Supongamos que no puedo tocar esta función.
def progress(xs):
    islice(xs, 1) # o algún otro valor arbitrario.

foo = iter(a_list)
while list(copy.copy(foo)): # 🤮
    progress(foo)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Aquí hay una solución alternativa utilizando un bloque try-except:

    from itertools import islice
    
    # Supongamos que `foo` es un iterador
    foo = iter(a_list)
    
    # Continuar llamando a `progress` hasta que `foo` esté vacío
    while True:
        try:
            progress(foo)
        except StopIteration:
            break
    

    Esta solución captura la excepción StopIteration generada por foo cuando está vacío, y luego sale del bucle while. Dado que progress garantiza nunca generar StopIteration, solo será cuando foo se queda vacío que causa que el bucle termine.

Comments are closed.