Поиск шаблонов в списке
Я пытаюсь написать python script, чтобы найти шаблоны в списке.
Eg. Учитывая этот список
[1,2,3,4,5,6,4,5,6,4,5,6,4,5,6]
script будет определять, что 4,5,6 раза 3 раза, а затем распечатать
3 (4,5,6)
Я надеялся, что если кто-нибудь будет анализировать алгоритмы (я могу только думать о n ^ 2 алгоритмах, где я проверяю шаблоны размером 1, затем 2, затем 3 и т.д. итерируя через строку каждый раз), или если может быть любые встроенные библиотеки Python, которые могут помочь сделать то же самое. Спасибо!
Сверху, я бы сделал это:
- начните с двух копий списка A и B.
вывести первое значение из B
вычесть B из A: C = A-B
поиск областей в C, которые равны 0; они указывают на повторяющиеся строки
добавить повторяющиеся строки в dict, который отслеживает каждую строку и количество раз, когда она была замечена
повторите шаги 2-5 до тех пор, пока не станет пустым.
Вот функция, обеспечивающая решение проблемы совпадения шаблонов:
import itertools
def pattern_match(pattern, sequence):
"""Count the number of times that pattern occurs in the sequence."""
pattern = tuple(pattern)
k = len(pattern)
# create k iterators for the sequence
i = itertools.tee(sequence, k)
# advance the iterators
for j in range(k):
for _ in range(j):
next(i[j])
count = 0
for q in zip(*i):
if pattern == q:
count += 1
return count
Чтобы решить указанную проблему, вызовите с помощью:
p = [4, 5, 6]
l = [1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
count = pattern_match(p, l)
Вот вам Gist с полным code, решающим проблему примера.
(Я верю, что правильный ответ заключается в том, что образец повторяется 4 раза, а не 3 раза, как указано в вопросе.)
Я не уверен, что сложность этого алгоритма на самом деле меньше O (n ^ 2).
Алгоритм, который вы ищете, Run Length Encoding. Основные принципы этого алгоритма дадут вам подход к обнаружению шаблонов в последовательности и подсчету их.
Кодировка длины пробега (RLE) - очень простая форма сжатия данных в который запускает данные (то есть последовательности, в которых одинаковое значение данных происходит во многих последовательных элементах данных) сохраняются как отдельные данные значение и количество, а не как исходный прогон.
Вот ссылка на как написать программу RLE в Python.