Sliding Window wäre jetzt das erste, was mir im Sinn kommt.
Du iterierst über die referenz-liste solange, bis dein Fenster voll ist. Dann vergleichst du dieses Fenster mit dem Muster.
Wenn es übereinstimmt, hast du einen Treffer. Falls nicht, ein neues Element von der referenz zum Fenster hinzufügen und das erste Element verwerfen.
Das mit Worten zu beschreiben, ist viel komplizierter, als Programmcode.
Code: Alles auswählen
from collections import deque
def sliding_window(iterable, size):
ret_type = type(iterable)
iterable = iter(iterable)
window = deque(maxlen=size)
while True:
if len(window) == size:
yield ret_type(window)
try:
cur = next(iterable)
window.append(cur)
except StopIteration:
break
def contains(reference, pattern):
if type(reference) != type(pattern):
raise TypeError('Reference and pattern must have the same type.')
window_size = len(pattern)
for window in sliding_window(reference, window_size):
if window == pattern:
return True
return False
Die erste Funktion sliding_window lässt sich vereinfachen, wenn man als Eingangstyp z.B. immer eine Sequenz erwartet.
Dann könnte man auch mit slicing arbeiten und müsste keinen iterator erzeugen.
Wenn man lange genug drüber nachdenkt, lässt sich sliding_window auch noch verbessern. (ggf. mit etwas aus itertools)
Die zweite Funktion vergleicht nur.
Hier nochmal ein Generator, der slicing verwendet.
Code: Alles auswählen
def sliding_window_slicing(reference, size):
for cursor in range(len(reference) - size + 1):
yield reference[cursor:cursor+size]
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server