son que los iteradores hace generadores generadoras funciones funcion creacion python filter iterator python-3.x iterable

los - que hace next en python



Componente de filtro/max de Python-comprobación de iterador vacío (3)

(Usando Python 3.1)

Sé que esta pregunta se ha hecho muchas veces para la pregunta general de probar si el iterador está vacío; obviamente, no hay una solución clara para eso (supongo que por una razón: un iterador no sabe realmente si está vacío hasta que se le pide que devuelva su próximo valor).

Tengo un ejemplo específico, sin embargo, y esperaba poder hacer código limpio y pitónico fuera de él:

#lst is an arbitrary iterable #f must return the smallest non-zero element, or return None if empty def f(lst): flt = filter(lambda x : x is not None and x != 0, lst) if # somehow check that flt is empty return None return min(flt)

¿Hay alguna forma mejor de hacer eso?

EDITAR: perdón por la notación estúpida. El parámetro para la función es de hecho iterativo arbitrario, en lugar de una lista.


puedes ir para reducir la expresión también return reduce(lambda a,b: a<b and a or b,x) or None


def f(lst): # if you want the exact same filtering as the original, you could use # lst = [item for item in lst if (item is not None and item != 0)] lst = [item for item in lst if item] if lst: return min(lst) else: return None

la comprensión de la lista solo permite elementos que no evalúan a booleano falso (que filtra 0 y ninguno)

una lista vacía, es decir, [] evaluará a False, por lo que "if lst:" solo se activará si la lista tiene elementos


def f(lst): flt = filter(lambda x : x is not None and x != 0, lst) try: return min(flt) except ValueError: return None

min arroja ValueError cuando la secuencia está vacía. Esto sigue el paradigma común de "Más fácil de pedir perdón".

EDITAR: una solución basada en reducción sin excepciones

from functools import reduce def f(lst): flt = filter(lambda x : x is not None and x != 0, lst) m = next(flt, None) if m is None: return None return reduce(min, flt, m)