Поиск последовательных шаблонов в списке - PullRequest
1 голос
/ 07 июня 2019

Как я могу использовать python, чтобы найти последовательное вхождение шаблона? Например, в ['a','b','a','b','c'] у нас есть 2 последовательных аб, поэтому это произошло дважды. ['a', 'b', 'a'] не содержит последовательного шаблона.

Я написал функцию, которая может рассчитывать только появление шаблона, но не обязательно последовательное появление

def get_occur(list, seq):
    return ''.join(list).count(''.join(seq))

1 Ответ

0 голосов
/ 07 июня 2019

Я просто хотел бы отметить, что если вы буквально пытаетесь найти повторяющиеся шаблоны в строках, вы должны использовать re buildin .

Основываясь на том, что @Selcuk сказал в своемcomment,

l = ['a', 'b', 'a', 'b', 'c', 'd']
print(l)

def consec_pattern(lst, pvs):
    # recursively return number of consecutive times pvs (previous pattern)
    # occurs in lst (list)

    if len(lst) < len(pvs):
        return 0 # no occurances of pvs in lst

    if lst[:len(pvs)] == pvs:  # if pvs is found at the start of lst
        shorter = lst[len(pvs):]
        return consec_pattern(shorter, pvs) + 1
    return 0  # if this is not the case, return 0

print(consec_pattern(l, [*'ab']))

# we can now annotate the list with number of occurances
l = [*'xababcd']
print(*l)
for i in range(len(l)):
    # take an element off of l each time you call to find
    # the value for the next position
    print(consec_pattern(l[i:], [*'ab']), end=' ')
print()

Это решение O (n), если вы хотите последовательные вхождения конкретного подсписка, и его можно использовать для поиска вхождений всех подсписков, но, вероятно, существует гораздо более эффективный способсделайте это, если вам нужны все списки последовательных вхождений.

Редактировать

Используя библиотеку регулярных выражений, вы можете использовать функцию поиска

import re
string = 'xababcdab'
pattern = 'ab'

match = re.search(f'({pattern})+', string)
start, end = match.span()
consecutive_matches = (end-start)//len(pattern)
print(consecutive_matches)  # outputs 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...