Python 识别(可变长度的)必须以连续顺序出现的数字块

Python 识别(可变长度的)必须以连续顺序出现的数字块,python,list,indexing,pattern-matching,Python,List,Indexing,Pattern Matching,问题陈述: 当且仅当数组具有以下结构时,才接受该数组: 第一个a1元素等于1 下一个a2元素等于2 下一个a3元素等于3 下一个a4元素等于4 下一个a5元素等于5 下一个a6元素等于6 下一个a7元素等于7 其中: a(i)可以是任何非零正整数 数组中没有其他元素 尽管这个问题的算法似乎很容易实现,但我在代码方面遇到了一些困难。这是我写的 print("Enter list: ") arr = [int(x) for x in input().split()] print(arr) i

问题陈述: 当且仅当数组具有以下结构时,才接受该数组:

  • 第一个a1元素等于1
  • 下一个a2元素等于2
  • 下一个a3元素等于3
  • 下一个a4元素等于4
  • 下一个a5元素等于5
  • 下一个a6元素等于6
  • 下一个a7元素等于7
其中:

  • a(i)可以是任何非零正整数
  • 数组中没有其他元素
尽管这个问题的算法似乎很容易实现,但我在代码方面遇到了一些困难。这是我写的

print("Enter list: ")
arr = [int(x) for x in input().split()]
print(arr)
i = 0

if arr[0] == 1:  # to check whether input starts with a 1. 
    if arr[i] == 1:  #If next number is also 1, then
        while arr[i] == 1:  #while numbers are equal to 1, increment i
            i = i + 1
            if arr[i] == 2: #If next number is 2, then
                while arr[i] == 2: #same procedure as above ... and so on
                    i = i + 1
                    if arr[i] == 3:
                        while arr[i] == 3:
                            i = i + 1
                            if arr[i] == 4:
                                while arr[i] == 4:
                                    i = i + 1
                                    if arr[i] == 5:
                                        while arr[i] == 5:
                                            i = i + 1
                                            if arr[i] == 6:
                                                while arr[i] == 6:
                                                    i = i + 1
                                                    if arr[i] == 7:
                                                        while arr[i] == 7:
                                                            i = i + 1
                                                        if arr[-1] == 7: #to check if last number is a 7
                                                            print("Accepted")
                                                        else:
                                                            print("not")
                                                    else:
                                                        print("not")
                                            else:
                                                print("not")
                                    else:
                                        print("not")
                            else:
                                print("not")
                    else:
                        print("not")
            else:
                print("not")
    else:
        print("not")
else:
    print("not")
我似乎得到了某种索引错误,它说:

   while arr[i] == 7:
IndexError: list index out of range
我不明白为什么我会遇到这个错误。据我所知,我没有超出列表索引。

您可以尝试以下方法:

def is_accepted(arr):
    return arr[0] == 1 and all(arr[i] -1 == arr[i-1] or arr[i] == arr[i-1] for i in range(1, len(arr)))

print(is_accepted([1, 2, 3, 4, 5, 6, 7]))
输出:

True
False
True
第二份名单:

s = [1, 2, 3, 4, 5, 5, 4, 3, 5, 6, 7]
print(is_accepted(s))
输出:

True
False
True
最后输入:

s = [1, 1, 2, 2, 3, 3, 3, 4, 5, 6, 6, 7]
print(is_accepted(s))
输出:

True
False
True

递归的有趣练习

在下列条件下编写案例:

  • 列表为空

  • 列表的第一项小于最后一项被检查为短路

  • 递归匹配

def匹配(lst,上次检查=1): 如果lst=[]:返回True#基本情况 如果lst[0]<上次检查: 返回错误 返回True并匹配(lst[1:],lst[0])
输入列表:1234567[1,2,3,4,5,5,4,3,5,6,7]True
对于错误的模式也显示True。@SakshiJain当我运行您刚刚发布的列表时,输出为False。它对冗余数字无效。假设根据问题陈述输入字符串
s=[1,1,2,2,3,3,3,4,5,6,6,7]
,则该字符串为有效输入。但是程序却不这么说。@SakshiJain那么你是说冗余数字在这个问题上是可以接受的?我认为解决这个问题的方法是添加一个if语句,比如
if arr[I]==arr[I-1]或arr[I]==arr[I-1]+1
,而不是你原来的条件。欢迎使用堆栈溢出-很高兴有你。请阅读并帮助将堆栈溢出内容保持在尽可能高的级别,并增加获得适当答案的机会。我不得不说,这看起来像是高度冗余的代码。我很确定你可以用几行文字来简化所有这些。给您一个提示,您希望找到的数字与您希望它在数组中的位置非常接近。Dupe目标的可能重复是针对Java的,但在Python中解决方案并没有那么大的不同。