def is_sublist(L, S):
index = -1
S_len = len(S)
stop = len(L)-S_len + 1
while S_len:
try:
index = L.index( S[0], index+1, stop )
if all( i==L[ind] for ind, i in enumerate(S, index) ):
return True
except ValueError: return
def is_sublist(L, S):
index = -1
S_len = len(S)
stop = len(L)-S_len + 1
while S_len:
try:
index = L.index( S[0], index+1, stop )
if all( i==L[ind] for ind, i in enumerate(S, index) ):
return True
except ValueError: return
def is_sublist(L, S):
try:
index = -1
while 1:
index = L.index( S[0], index+1 )
if all( i==L[ind] for ind, i in enumerate(S, index) ):
return True
except (ValueError, IndexError): pass
alexx11в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.
Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.
appetitoА попробуйте с такими списками:
в 2.6 (где есть ТАКОЙ enumerate) оба варианта примерно одинаковы по скорости.
S = list(range(5000))
L = [0]*100000 + S
def is_subsequence(sub_seq, seq):
""" Return True if sub_seq is subsequnce of seq.
Used algorithm for solving of the small sample size problem.
>>> is_subsequence([1, 2], [1, 2, 3])
True
>>> is_subsequence([2, 1], [1, 2, 3])
False
>>> is_subsequence([1, 2], [1, 22, 3])
False
>>> is_subsequence([1, 2, 3], [1, 2])
False
>>> is_subsequence([1, 2], [1, 3, 2])
True
"""
sub_seq_index = len(sub_seq) - 1
seq_index = len(seq) - 1
if sub_seq_index > seq_index:
return False
while sub_seq_index and seq_index:
if sub_seq[sub_seq_index] == seq[seq_index]:
sub_seq_index -= 1
seq_index -= 1
else:
seq_index -=1
if (seq_index == 0 and sub_seq_index == 0) or (seq_index and sub_seq_index == 0):
return True
else:
return False
def is_sublist(pattern, seq):
""" Return True if sub_seq is subsequnce of seq.
Used Knuth-Morris-Pratt algorithm.
>>> is_sublist([1, 2], [1, 2, 3])
True
>>> is_sublist([2, 1], [1, 2, 3])
False
>>> is_sublist([1, 2], [1, 22, 3])
False
>>> is_sublist([1, 2, 3], [1, 2])
False
>>> is_sublist([1, 2], [1, 3, 2])
False
"""
def get_prefix():
""" Get prefix function
>>> get_prefix(list('ababaa'))
[-1, 0, 0, 1, 2, 3, 1]
"""
prefix = [0]*pattern_length
j = 0
for i in range(1, pattern_length):
while (j>0) and pattern[i]!=pattern[j]:
j = prefix[j-1]
if pattern[j] == pattern[i]:
j += 1
prefix[i] = j
return [-1]+prefix
pattern_length = len(pattern)
seq_length = len(seq)
if pattern_length > seq_length:
return False
prefix = get_prefix()
j = 0
for item in seq:
while j>=0 and pattern[j]!=item:
j = prefix[j]
j += 1
if j==pattern_length:
return True
return False
Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.Читаем тему:
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.Источник моей “копипасты” в студию, “уважаемый”.
FerromanА с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
FerromanВозможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.
Источник моей “копипасты” в студию, “уважаемый”
А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.Вот из-за несоответствия терминологии и примеров я дал 2 варианта.
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.Принято.