您的功能可以简化为:
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 执行实际比较。
- 由括号
() 表示的 generator expression 确保条件的每个值,即 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 recipe,也可以通过第三方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))
另一种选择是使用函数式方法而不是推导式:
from operator import le
def checker_functional(nums):
return all(map(le, nums, nums[1:]))