您可以使用zip() 函数和all() 函数:
is_ascending = all(i < j for i, j in zip(currentList[:-1], currentList[1:]))
currentList[:-1] 对原始列表进行切片,以便第一个切片排除最后一个元素。 currentList[1:] 做同样的事情,第一个元素。
zip() 这两个切片为我们提供了一个迭代器,它在解包时将元素 x 放入变量 i,并将元素 x+1 放入变量 j。
然后,我们只需比较 i 和 j 并检查所有此类对的条件是否成立。
由于需要对列表进行切片,这可能并不比写出所有内容更快,但是可以扩展到更长的列表而无需写出所有内容。切片的替代方法是在范围内迭代。
is_ascending = True
for i in range(len(currentList)-1):
if currentList[i] >= currentList[i+1]:
is_ascending = False
break
要检查哪一个最快,让我们将所有这些放在各自的函数中:
def fun1(currentList):
return (currentList[0] < currentList[1]) and (currentList[1] < currentList[2]) and (currentList[2] < currentList[3]) and (currentList[3] < currentList[4])
def fun2(currentList):
return all(i < j for i, j in zip(currentList[:-1], currentList[1:]))
def fun3(currentList):
for i in range(len(currentList)-1):
if currentList[i] >= currentList[i+1]: return False
return True
testlist = [1, 2, 3, 4, 5]
%timeit fun1(testlist)
306 ns ± 29.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit fun2(testlist)
1.15 µs ± 44.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit fun3(testlist)
741 ns ± 43.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
显然,您的原始方法 (fun1) 是最快的(因为它不需要创建任何额外的对象),但是如果您的列表中有更多元素,那么编写起来很快就会很烦人。这个例子很好地说明了为什么“most pythonic”不是“fastest”的同义词。