Tengo una función llamada checker(nums) que tiene un argumento que luego recibirá una lista. Lo que quiero hacer con esa lista es verificar si cada elemento es mayor o igual que el anterior. Ejemplo: tengo una lista [1, 1, 2, 2, 3] y tengo que verificar si cumple la condición. Como lo hace, la función debería devolver True
Mi código:
def checker(nums): for x in range(len(nums)): if x+1<len(nums): if nums[x] <= nums[x+1] and nums[-1] >= nums[-2]: return TrueEsto solo se ejecutará una vez y devolverá True si la primera condición es verdadera. He visto una declaración si todo y no estoy seguro de cómo usarla.
Su función se puede reducir a esto:
def checker(nums): return all(i <= j for i, j in zip(nums, nums[1:]))Tenga en cuenta lo siguiente:
zip recorre sus argumentos en paralelo, es decir, se recuperan nums[0] y nums[1] , luego nums[1] y nums[2] etc.i <= j realiza la comparación real.() asegura que cada valor de la condición, es decir, True o False , se extraiga uno a la vez. Esto se llama evaluación perezosa .all simplemente comprueba que todos los valores son True . Una vez más, esto es perezoso. Si uno de los valores extraídos de forma perezosa de la expresión del generador es False , se produce un cortocircuito y devuelve False . Para evitar el gasto de crear una lista para el segundo argumento de zip , puede usar itertools.islice . Esta opción es particularmente útil cuando su entrada es un iterador, es decir, no se puede dividir como una list .
from itertools import islice def checker(nums): return all(i <= j for i, j in zip(nums, islice(nums, 1, None))) Otra opción fácil de iterador es usar la receta de itertools pairwise , también disponible a través more_itertools.pairwise terceros:
# from more_itertools import pairwise # 3rd party library alternative from itertools import tee def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = tee(iterable) next(b, None) return zip(a, b) def checker(nums): return all(i <= j for i, j in pairwise(nums))Otra alternativa es utilizar un enfoque funcional en lugar de una comprensión:
from operator import le def checker_functional(nums): return all(map(le, nums, nums[1:]))De hecho, su código puede reducirse a verificar si los nums están ordenados, por ejemplo
def checker(nums): return sorted(nums) == numsEsto hace exactamente lo que esperas, por ejemplo
>>> checker([1, 1, 2, 2, 3]) True >>> checker([1, 1, 2, 2, 1]) FalseSolución similar a @jp_data_analysis usando more_itertools.windowed
>>> from more_itertools import windowed >>> nums = [1, 1, 2, 2, 3] >>> all(i <= j for i, j in windowed(nums, 2)) TrueY para fines científicos (código no recomendado), aquí hay un enfoque más funcional
>>> from operator import le >>> from itertools import starmap >>> all(starmap(le, windowed(nums, 2))) True