Obecnie szukam sposobu na znalezienie wzorców na liście liczb całkowitych, ale metoda, którą zamierzam użyć, będzie miała zastosowanie do łańcuchów i innych list z różnymi elementami oczywiście. Teraz pozwól mi wyjaśnić, czego szukam.Znajdowanie wzorców na liście
Chcę znaleźć najdłuższy powtarzający się wzór na liście liczb całkowitych. Na przykład:
[1, 2, 3, 4, 1, 2, 3]
# This list would give 1, 2, 3
Nakładające się wzory należy wyrzucić. (Nie jest pewne)
[1, 1, 1, 1, 1]
# Should give 1, 1 Not 1, 1, 1, 1
Oto co mi nie pomoże.
Finding patterns in a list (nie rozumiem logikę pierwszej odpowiedzi, bardzo mało wyjaśnień. A po drugie odpowiedź rozwiązuje problem tylko wtedy, gdy wzór jest znany przed rozwiązywania.)
Finding integer pattern from a list (wzór jest podany i numer występowania Inaczej niż moje pytanie.)
Longest common subsequence problem (Większość osób zajmowała się tym problemem, ale nie jest to bliskie mojej, potrzebuję kolejnych elementów podczas wyszukiwania wzoru, jednak w tym przypadku oddzielne elementy również są liczone jako podciągi.)
Oto, co próbowałem.
def pattern(seq):
n = len(seq)
c = defaultdict(int) # Counts of each subsequence
for i in xrange(n):
for j in xrange(i + 1, min(n, n/2 + i)):
# Used n/2 because I figured if a pattern is being searched
# It cant be longer that the half of the list.
c[tuple(seq[i:j])] += 1
return c
Jak widać, to wyszukuje wszystkie listy zagnieżdżone i sprawdzić powtórzeń. Uważam, że to podejście jest trochę naiwne (i nieskuteczne) i potrzebuję lepszego sposobu. Proszę pomóż mi. Z góry dziękuję.
Uwaga 1: Lista jest z góry ustalona, ale z powodu błędów mojego algorytmu mogę tylko sprawdzić niektóre części listy przed zamrożeniem komputera. Wzorzec, który próbuję znaleźć, może być dłuższy niż połowa listy wyszukiwania. Może być nawet dłuższy niż sama lista wyszukiwania, ponieważ szukam tylko części oryginalnej listy. Jeśli przedstawisz lepszą metodę niż Używam, mogę przeszukiwać większą część oryginalnej listy, więc będę miał większą szansę na znalezienie wzoru. (Jeśli takowy istnieje).Uwaga2: Oto część listy, jeśli chcesz przetestować ją samodzielnie. Wygląda na to, że istnieje pewien wzór, ale nie mogę być tego pewien, zanim przetestuję go niezawodnym kodem. Sample List
Uwaga 3: Podchodzę do tego jako poważny problem eksploracji danych. I spróbuje się dowiedzieć, czy robisz długie wytłumaczenie. Wydaje się, że jest to znacznie ważniejszy problem niż LCS, jednak LCS jest znacznie bardziej popularny: D Ta metoda, którą próbuję znaleźć, przypomina metody stosowane przez naukowców do wyszukiwania wzorców DNA.
Co będzie wynikiem '[1,2,3,4,3,4,1,2]' być? – dashiell
Powiązane: http://stackoverflow.com/q/26703839/198633 – inspectorG4dget
@dashiell Nie spodziewam się takiego wystąpienia na mojej liście, jednak sądzę, że ponieważ oba wzorce mają długość 2, wynik byłby oba. –