我想检查Python中的数组是否包含递增元素,每个递增1并从0开始。例如, [0, 1, 2, 3]
应返回"有效",而例如[0, 1, 3, 4]
或[-1, 0, 1]
应返回"无效"。
有没有一种简单的方法可以在Python中实现这一目标?也许内置函数?
答案 0 :(得分:7)
如果问题确实如你所描述的那样,可以使用range
来解决这个问题,如下所示:
myList = [...]
if myList == list(range(myList[-1] + 1)):
# Do stuff.
答案 1 :(得分:2)
如何使用all
:
>>> l = [0, 1, 2, 3]
>>> not l[0] and all(y-x==1 for x,y in zip(l, l[1:]))
True
>>> l1 = [0,1,2,3,5,7]
>>> not l[0] and all(y-x==1 for x,y in zip(l1, l1[1:]))
False
>>> l2 = [0,1,2,3,4,7]
>>> not l[0] and all(y-x==1 for x,y in zip(l2, l2[1:]))
False
>>> l3=[-1,0,1,2]
>>> not l[0] and all(y-x==1 for x,y in zip(l3, l3[1:]))
False
>>> l2 = [0,1,2,3,4,5,7]
>>> not l[0] and all(y-x==1 for x,y in zip(l2, l2[1:]))
False
>>> l4=[0,2,3,4,5,7,8]
>>> not l[0] and all(y-x==1 for x,y in zip(l4, l4[1:]))
False
>>> l5=[0,2,3,4,5,6,7,8]
>>> not l[0] and all(y-x==1 for x,y in zip(l5, l5[1:]))
False
所以你可以这样把它放到一个函数中:
def check_my_list(lst):
if not lst:
print 'List Empty'
return False
test = not lst[0] and all(y-x==1 for x,y in zip(lst,lst[1:])
return test
答案 2 :(得分:1)
我认为它可以通过功能性的单行解决:
print not len(filter(lambda i: i!=-1, [x[i]-x[i+1] for i in range(len(x)-1)]))
True
的{{1}}和x = [0, 1, 2, 3]
的{{1}}
说明:
False
列出了连续元素之间的差异,显然我们希望拥有所有x = [0, 1, 3, 4]
...
然后我们使用 [x[i]-x[i+1] for i in range(len(x)-1)]
来选择那些与-1
不同的元素,如果至少有一个元素,则它不是递增元素,因此这样过滤后的列表的长度> 0
如果是,即只有filter
,则该字段为空,我们得到的长度为0.