![](/img/trans.png)
[英]Check if there is an ascending order in a list of list of integers (Python)
[英]Check if list is ascending by 1 in python
我想检查我给定的列表是否按 1 递增
所以:
[1,2,3,4] = True [1,3,4,5] = False
如果可能的话,我想用一些 python 特定功能来做到这一点 - 所以不要用 for if 组合循环它,而是像 all(... for values in list)
我希望这很清楚
这个怎么样?
def has_stepsize_one(it):
return all(x2 - x1 == 1 for x1, x2 in zip(it[:-1], it[1:]))
>>> has_stepsize_one([1,2,3,4])
True
>>> has_stepsize_one([1,3,4,5])
False
这应该适用于任何集合,而不仅仅是列表。
请记住,对于少于两个元素的 collections,这将返回True
:
>>> has_stepsize_one([1])
True
>>> has_stepsize_one([])
True
如果您不希望这样,则必须检查迭代器的长度。
对于不支持getitem
的通用迭代器,与itertools.count
相比可能是最好的方法(类似于kaya3 的答案):
import itertools
def has_stepsize_one(it):
it = iter(it)
try:
first = next(it)
except StopIteration:
return True
return all(x == y for x, y in zip(it, itertools.count(first + 1)))
>>> has_stepsize_one((i for i in range(10)))
True
为什么不将其与range
进行比较
l == list(range(l[0], l[-1] + 1))
比较整个列表:
if my_list == list(range(my_list[0], my_list[0] + len(my_list)))
# do things
或者在列表本身中与 enumerate 进行比较:
if all(entry - 1 == my_list[i-1] or i == 0 for i, entry in enumerate(my_list))
其中i == 0
检查第一次迭代,这始终是正确的,因为天真的 for 循环将进行 len(my_list) 迭代,而我们只进行 len(my_list) - 1 比较。
它不是一个单一的 function 但你可以使用这个:
lst = [1,2,3,4]
print(lst == list(range(lst[0],lst[-1]+1,1)))
True
lst = [1,3,4,5]
print(lst == list(range(lst[0],lst[-1]+1,1)))
False
大多数其他答案都是通过创建一个新列表来工作的,这需要 O(n) 时间和 O(n) 辅助空间。 使用all
、 range
和zip
可以使用 O(1) 辅助空间来执行此操作。 此解决方案也会短路,因此在最佳情况下需要 O(1) 时间。
def is_ascending(lst):
# special case: an empty list is ascending
if not lst:
return True
start = lst[0]
end = start + len(lst)
# general case: an ascending list equals a range
return all( x == y for x, y in zip(lst, range(start, end)) )
测试:
>>> is_ascending([1, 2, 3, 4])
True
>>> is_ascending([1, 3, 4, 5])
False
>>> is_ascending([23])
True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.