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)