2024-06-25 23:02:06 发布
网友
我正在尝试编写一个函数来测试列表是否按降序排列。这是我目前所拥有的,但似乎并不适用于所有列表。
我使用了列表[9,8,5,1,4,3,2],它返回了'true'。
[9,8,5,1,4,3,2]
'true'
我好像不知道我的错误在哪里。
def ordertest(A): n = len(A) for i in range(n): if A[i] >= A[i+1]: return 'true' else: return 'false'
您应该进行反向检查(只要得到A[i] < A[i+1],就返回false
A[i] < A[i+1]
def ordertest(A): for i in range( len(A) - 1 ): if A[i] < A[i+1]: return False return True
您可以迭代输入,而不是使用索引:
def ordertest(iterable): it = iter(iterable) prev = next(it) for e in it: if e > prev: return False prev = e return True
注意,返回字符串'true'和'false'是一个坏主意。相反,您可以使用Python的内置booleans。
'false'
使用a generator expression和the ^{} builtin可以轻松完成此操作:
all(earlier >= later for earlier, later in zip(seq, seq[1:]))
例如:
>>> seq = [9, 8, 5, 1, 4, 3, 2] >>> all(earlier >= later for earlier, later in zip(seq, seq[1:])) False >>> seq = [9, 8, 5, 4, 3, 2] >>> all(earlier >= later for earlier, later in zip(seq, seq[1:])) True
这应该是一个好的、快速的方法,因为它避免了python端的循环,很好地短路(如果您在2.x中使用itertools.izip()),并且是好的、清晰的、可读的(例如,避免了索引上的循环)。
itertools.izip()
注意,所有迭代器(不仅仅是序列)的通用解决方案也是可能的:
first, second = itertools.tee(iterable) next(second) all(earlier >= later for earlier, later in zip(first, second))
您应该进行反向检查(只要得到
A[i] < A[i+1]
,就返回false您可以迭代输入,而不是使用索引:
注意,返回字符串
'true'
和'false'
是一个坏主意。相反,您可以使用Python的内置booleans。使用a generator expression和the ^{} builtin 可以轻松完成此操作:
例如:
这应该是一个好的、快速的方法,因为它避免了python端的循环,很好地短路(如果您在2.x中使用
itertools.izip()
),并且是好的、清晰的、可读的(例如,避免了索引上的循环)。注意,所有迭代器(不仅仅是序列)的通用解决方案也是可能的:
相关问题 更多 >
编程相关推荐