Ir para conteúdo
Fórum Script Brasil
  • 0

Preciso de ajuda para encontrar um padrão numa lista.


leandro Riato

Pergunta

Estou trabalhando um um algoritmo que lê um arquivo e depois de manipular os dados, joga eles numa lista. Esta lista contém um padrão de repetição em certo ponto dela, porém cada arquivo carregado gera um padrão diferente, então o algoritmo tem que ser capaz de encontrar esse padrão e retornar onde está.
Minha ideia foi gerar um loop que gera uma outra lista: lista[x : y]
E então compara com uma nova lista gerada tal que: lista2[y+1 : y + (y - x)]

Dessa forma se ela não encontrar duas listas iguais(o que indica um padrão) ela aumentaria a amostragem então de x até y, trabalharíamos com:
lista[x : y+1]
lista2 [y+2 : y + (y-2)]

 

Uma vez que encontrado o padrão o algoritmo retorna o local do padrão mas minha lógica não está funcionando e não consigo encontrar o local da falha. Segue em anexo o pedaço do algoritmo responsável por fazer isso:

fullcycle = []
start1 = -1
start2 = 0
end2 = -1
histdiv = 299
end1 = histdiv
reset = 0
sample1 = []
sample2 = []
stop = False
side = True
rise = False
while stop!= True:
    while side == True:
        start1 = start1 + 1
        end1 = end1 + 1
        start2 = end1 + 1
        end2 = start2 + (end1-start1)
        sample1.clear()
        sample2.clear()
        if end2 <= len(engine_phase_high😞
            for i in range (start2, end2😞
                sample2.append(engine_phase_high[i])
            i = None
            for i in range (start1, end1😞
                sample1.append(engine_phase_high[i])
            i = None
        else:
            for i in range(start2, len(engine_phase_high)):
                sample2.append(engine_phase_high[i])
            i = None
            for i in range(start1, len(engine_phase_high)-start2😞
                sample1.append(engine_phase_high[i])
            i = None
        if sample1 == sample2:
            for i in range(start1, end1😞
                fullcycle.append(start1)
                fullcycle.append(end1)
                print(fullcycle)
            i = None
            stop = True
        if sample1 != sample2 and end1 <= 6000:
            side = False
            rise = True
        else:
            side = True
    if rise == True:
        if end1 <= 6000:
            reset = reset + 1
            start1 = -1
            histdiv = end1
            end1 = histdiv + reset
            side = True
            rise = False
        if end1 > 6000:
            stop = True
            side = False
            rise = False
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

KKKKK ta meio complexo mesmo, deixa eu tentar explicar de outra forma, eu tenho uma lista "engine_phase_high" que tem apenas valores 2 valores (0.3 ou 5.4). Em algum momento esses valores se repetem e então um ciclo é completado.
Exemplo: [ 5.4, 5,4, 0,3, 0.3, 0.3, 0.3, 0.3, 5.4, 5,4, 0.3, 0.3, 0.3, 0.3, 0.3, 5.4, 5,4, 0.3, 0.3, 0.3, 0.3, 0.3, 5.4, 5,4, 0,3, 0.3, 0.3, 0.3].
Temos um ciclo aqui de [0.3, 0.3, 0.3, 0.3, 5.4, 5,4, 0.3], depois isso só se repete.

Mas esse momento que eles se repetem não é sempre o mesmo, ele depende do arquivo que eu escolho parar ler, então eu preciso de um algoritmo pra percorrer essa lista e encontar onde temos um ciclo completo, em outras palavras, onde os dados se repetem.

Eu pensei que rodando um loop e preenchendo as listas "sample1" e "sample2" com um tamanho de 300 no inicio e comparando eles, se o loop encontrar que sample1 == sample2 ele guarda os índices da engine_phase_high que tem um ciclo dentro da lista "full_cycle". Uma vez que o loop rodou a lista toda e não encontrou nenhuma vez a condição sample1==sample2, o tamanho das amostras aumenta de 300 para 301 e roda denovo, se não encontrar pegamos 302 valores para cada lista e comparamos.

Dessa forma quando entramos no loop temos:

             |     sample1    |      sample2    |
| Reset | Start1 | End1 | Start2 | End2 |
| 0        | 0         | 300  | 301      | 601   |
| 0        | 1         | 301   | 302     | 602  |
| 0        | 2         | 302  | 303     | 603  |
 

Quando End2 chegar em 12000 significa que chegamos no final da lista, então o Reset recebe +1, então o nosso número de amostras deixa de ser 300 e passa a ser 301 ficando da seguinte forma:

             |     sample1    |      sample2    |
| Reset | Start1 | End1 | Start2 | End2 |
| 1        | 0         | 301    | 302    | 603  |
| 1        | 1          | 302   | 303    | 604   |
| 1        | 2         | 303   | 304    | 605   |

Quando End2 chegar em 12000 significa que chegamos no final da lista, então o Reset recebe +1, então o nosso número de amostras deixa de ser 301 e passa a ser 302 ficando da seguinte forma:

             |     sample1    |      sample2    |
| Reset | Start1 | End1 | Start2 | End2 |
| 2        | 0         | 302    | 303    | 605  |
| 2        | 1          | 303   | 304    | 606  |
| 2        | 2         | 304   | 305    | 607   |

Basicamente isso que eu preciso fazer. Mas ta bem difícil encontrar o erro.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...