Поиск шаблонов в списке

80
6

Я пытаюсь написать 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, которые могут помочь сделать то же самое. Спасибо!

спросил(а) 2011-07-11T23:44:00+04:00 9 лет, 2 месяца назад
1
Решение
57

Сверху, я бы сделал это:

    начните с двух копий списка A и B.
    вывести первое значение из B
    вычесть B из A: C = A-B
    поиск областей в C, которые равны 0; они указывают на повторяющиеся строки
    добавить повторяющиеся строки в dict, который отслеживает каждую строку и количество раз, когда она была замечена
    повторите шаги 2-5 до тех пор, пока не станет пустым.

ответил(а) 2011-07-12T02:51:00+04:00 9 лет, 2 месяца назад
57

Вот функция, обеспечивающая решение проблемы совпадения шаблонов:


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).

ответил(а) 2015-03-05T13:34:00+03:00 5 лет, 6 месяцев назад
57

Алгоритм, который вы ищете, Run Length Encoding. Основные принципы этого алгоритма дадут вам подход к обнаружению шаблонов в последовательности и подсчету их.


Кодировка длины пробега (RLE) - очень простая форма сжатия данных в который запускает данные (то есть последовательности, в которых одинаковое значение данных происходит во многих последовательных элементах данных) сохраняются как отдельные данные значение и количество, а не как исходный прогон.



Вот ссылка на как написать программу RLE в Python.

ответил(а) 2011-07-11T23:46:00+04:00 9 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема