Форум сайта python.su
Для такого дела и я не останусь в стороне. Ищем S в L.
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
Отредактировано (Янв. 15, 2011 20:37:09)
Офлайн
Isem Раза в два пошустрей у тебя будет, я просто в основном под 2.5 сижу, там нет такого enumerate со вторым параметром.
Офлайн
Ну а я сразу начал с 3-го питона, нет у меня необходимости в библиотеках, которые написаны только для питона 2.x. Тем более numpy и scipy для 3.1. уже вышли. Осталось только дождаться matplotlib для полного счастья.
Ну и напоследок незагроможденный вариант с выброшенными не столь важными нюансами оптимизации.
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
Отредактировано (Янв. 16, 2011 00:27:41)
Офлайн
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
Офлайн
Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.
Офлайн
Вот теперь давайте по порядку.
Что еще за “в математическом смысле”? Мы тут что, философствуем что-ли? И при чем тут вообще другая задача.Читаем тему:
Что касается КМП алгоритма, то его ни кто тут не отменял, но то,что вы умеете копипастить, это похвально.Источник моей “копипасты” в студию, “уважаемый”.
Отредактировано (Янв. 16, 2011 22:13:01)
Офлайн
По порядку, так по порядку.
FerromanА с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.
Читаем тему:
“проверить вхождение последовательности в список”.
То что у Вас понятие последовательности не ассоциируется с математической последовательностью — Ваша личная проблема. Я предложил все варианты.
FerromanВозможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.
Источник моей “копипасты” в студию, “уважаемый”
Офлайн
Isem
А с чем она еще может ассоциироваться, если в качестве примера (смотрим первый пост) была приведена последовательность целых чисел? И там же пример последовательности, которая не входит в приведенный список по условию задачи, что, следуя Вашей логике, уже не является математическим смыслом.Вот из-за несоответствия терминологии и примеров я дал 2 варианта.
Возможно, я ошибся, сомневаясь, что Вы сами целиком и полностью разобрались и реализовали этот алгоритм (а не просто переписали его с рыбы), и если это Вас задело, то приношу свои извинения.Принято.
Офлайн