Как я могу найти определенный шаблон в списке?

#python #list

#python #Список

Вопрос:

Учитывая список чисел, содержащий либо 0, либо 1, либо -1, как я могу найти самую длинную часть списка, которая начинается с 1 и заканчивается -1.

Например, [0,0,1,1,1,-1,-1,-1,0] : Самая длинная часть равна 6 из-за части списка [1,1,1,-1,-1,-1].

Например, [1,-1,0,1,-1,-1,-1] : Самая длинная часть равна 4 из-за части списка [1,-1,-1,-1]. Обратите внимание, что если бы в исходном списке были только первые 3 элемента (например, [1,-1,0] ), то правильным ответом было бы 2 [1,-1] .

Кроме того, список нельзя разбить на 0, и он может меняться от 1 до -1 только один раз. Другими словами [ 1,-1, 1,-1] по-прежнему только 2.

Спасибо

Ответ №1:

Вам нужно иметь два bool(previous_has_one существует, previous_has_neg_one), чтобы записать, существуют они или нет.

 def getLongestPortion(l):
    maxx = 0
    curMax = 0
    JustHadOne = False
    JustHadNeg = False
    for i in range(len(l)):
        if(l[i]==1):
            if(JustHadNeg):
                curMax = 0
            curMax  = 1
            JustHadOne = True
            JustHadNeg = False
        elif(l[i]==-1 and JustHadOne):
            curMax  = 1
            maxx = max(maxx,curMax)
            JustHadNeg = True
        else:
            JustHadOne = False
            JustHadNeg = False
            curMax=0
    return maxx

l = [1,-1,-1,0,1,1,-1,-1]
print(getLongestPortion(l))

 

Ответ №2:

Вот решение для регулярных выражений. Сначала я меняю список like [1, -1, 0, 1, -1, -1, -1] на строку like 'ab abbb' , затем я ищу 'a b ' , затем беру максимальную длину совпадений:

 import re

max(map(len, re.findall('a b ', ''.join(' ab'[i] for i in l))))