Ответ 1
Ваша функция может быть уменьшена до этого:
def checker(nums):
return all(i <= j for i, j in zip(nums, nums[1:]))
Обратите внимание на следующее:
-
zip
перебирает свои аргументы параллельно, то естьnums[0]
&nums[1]
, затемnums[1]
&nums[2]
и т.д. -
i <= j
выполняет фактическое сравнение. - Выражение генератора, обозначенное круглыми скобками
()
гарантирует, что каждое значение условия, т.е.True
илиFalse
, извлекается по одному за раз. Это называется ленивой оценкой. -
all
просто проверяет, что все значенияTrue
. Опять же, это лениво. Если одно из значений, лениво извлеченных из выражения генератора, являетсяFalse
, оно закорачивает и возвращаетFalse
.
альтернативы
Чтобы избежать затрат на создание списка для второго аргумента zip
, вы можете использовать itertools.islice
. Эта опция особенно полезна, когда ваш ввод является итератором, то есть он не может быть разрезан как list
.
from itertools import islice
def checker(nums):
return all(i <= j for i, j in zip(nums, islice(nums, 1, None)))
Другой итератор дружественного варианта заключается в использовании itertools
pairwise
рецепта, также доступен через 3 партии more_itertools.pairwise
:
# 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))