繁体   English   中英

检查列表是否在 python 中按 1 递增

[英]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) 辅助空间。 使用allrangezip可以使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM